Skip navigation
Currently Being Moderated

Add a feature - Line length

Jun 23, 2008 5:18 AM

Is it possible to add the information of line length on curved lines and also have the ability to lock that line segment yet still able to drag around the anchor points constrained to the fixed/lock length. Also add the feature of displaying in the info window the line length of any line segment in a line from anchor point to anchor point.

Would it be possible to add some sort of conversion tool that allows someone to take full illustrations a scale them to architectural scales. but does not affect the scaling of the illustration. some sort of window that has preset scale measurements.

Thanks

Jim Billings
 
Replies
  • Currently Being Moderated
    Jun 23, 2008 6:05 AM   in reply to (jbillings)
    I'm not quite sure what you're asking, but at least part of it sounds like you're wondering if you can display the length of a path in the Info window. If that's what you're asking, no, that's not possible. Nothing stops you from creating your own small palette to display such information though.

    As for constraining the ability to edit parts of a path, no, you can't do that either. You might be able to construct a custom art type that let you do that, but it wouldn't be considered path art by Illustrator. If that's okay though, you might check out the AIPluginGroup suite.

    > Would it be possible to add some sort of conversion tool that
    > allows someone to take full illustrations a scale them to
    > architectural scales. but does not affect the scaling of the
    > illustration. some sort of window that has preset scale
    > measurements.

    Again, I'm not quite sure I follow. It kind of sounds like the work we do with MAPublisher, at least a little. If so, I'm guessing 'yes', but I'm not 100% sure since I don't quite understand what you're trying to do.
     
    |
    Mark as:
  • Currently Being Moderated
    Jun 23, 2008 12:05 PM   in reply to (jbillings)
    If you're just trying to calculate that value in page units, there's a function AIPathSuite::GetPathLength() that should give you the length in *points*. You'll have to convert that to whatever units you want that in (be it inches, millimeters, centimeters, etc.). From what I remember, this should work for bezier lines as well.

    If that doesn't work for some reason, I can point you to some example code that would let you do that yourself.
     
    |
    Mark as:
  • Currently Being Moderated
    Aug 28, 2008 10:12 AM   in reply to (jbillings)
    Could you please explain better the function you are talking about? I don't quite understand how to get there. I'm having the same issue, I need to find out the length of a line. I was told that exporting the illustrator file to autocad, would do the trick, but I'm having problems doing it from CS3. If tehre is a way to find the lenght in Illustrator, it would be great!
    Thanks,
     
    |
    Mark as:
  • Currently Being Moderated
    Aug 29, 2008 11:38 AM   in reply to (jbillings)
    The AIPathSuite has function GetPathLength() that will get you the length of any path in points. Just pass it the handle of the line and you'll get your length value back. If you want that value in something other than points you'll have to convert it from points to whatever. That part you'll have to do yourself I think, but then there are well known conversion values for all the document units Illustrator uses.
     
    |
    Mark as:
  • Currently Being Moderated
    Aug 29, 2008 12:05 PM   in reply to (jbillings)
    I use the routine below in my tool JLG.Dimension (http://perso.orange.fr/jlg.outils) to calculate the length of a Bezier curve.<br />This is my little contribution to this discussion. To obtain the length as a string, you have to use a routine to convert a AIReal number into a string.<br />I hope this will help somebody.<br /><br />extern void BezierLength(AIArtHandle *path, short unit, AIReal scale, char BezierlengthText[])<br />     {//Calculate in BezierlengthText the total length of the Bezier curve (path). The result is a string.<br />     //If unit is 0 the length will be mm, 1 cm, 2 inches, 3 points, 4 picas and 5 for meters. <br />     AIErr error=kNoErr;<br />     long i, j;<br />     short pathCount, NtS;//NtS for number to string.<br />     AIBoolean IsClosed;<br />     AIRealBezier PtBezier;<br />     AIPathSegment Pt1, Pt2;<br />     //At the beginning, the length is zero.<br />     AIReal LengthOfBezier=0.0;<br />     <br /><br />     error = sPath->GetPathSegmentCount(*path, &pathCount );<br />     //If the path analyzed is closed, it will be necessary to add the length of the last part of the Bezier curve. <br />     error=sPath->GetPathClosed(*path, &IsClosed);<br /><br />     for(j=0;j<pathCount-1;j++)<br />          {//One point and the next point.<br />          error = sPath->GetPathSegments( *path, j, 1, &Pt1);<br />          error = sPath->GetPathSegments( *path, j+1, 1, &Pt2);<br /><br />          PtBezier.p0.h=Pt1.p.h;<br />          PtBezier.p0.v=Pt1.p.v;<br /> <br />          PtBezier.p1.h=Pt1.out.h;<br />          PtBezier.p1.v=Pt1.out.v;<br /><br />          PtBezier.p2.h=Pt2.in.h;<br />          PtBezier.p2.v=Pt2.in.v;<br /><br />          PtBezier.p3.h=Pt2.p.h;<br />          PtBezier.p3.v=Pt2.p.v;<br /><br />          LengthOfBezier+=sBezier->Length(&PtBezier, 1.0);<br />          }<br /><br />     if(IsClosed)<br />          {//The path is closed, we must calculate the length of the last segment (point 0 and point pathCount-1).<br />          error = sPath->GetPathSegments( *path, 0, 1, &Pt1);<br />          error = sPath->GetPathSegments( *path, pathCount-1, 1, &Pt2);<br /><br />          PtBezier.p0.h=Pt1.p.h;<br />          PtBezier.p0.v=Pt1.p.v;<br /><br />          PtBezier.p1.h=Pt1.in.h;<br />          PtBezier.p1.v=Pt1.in.v;<br /><br />          PtBezier.p2.h=Pt2.out.h;<br />          PtBezier.p2.v=Pt2.out.v;<br /><br />          PtBezier.p3.h=Pt2.p.h;<br />          PtBezier.p3.v=Pt2.p.v; <br />          LengthOfBezier+=sBezier->Length(&PtBezier, 1.0);<br />          }<br /><br />     //At this moment, LengthOfBezier contains the total length of the curve but the unit used is the point.<br />     switch(unit)<br />          {case 0://millimeters.<br />               LengthOfBezier=LengthOfBezier* 25.4 / 72.0 / scale;<br />               //Transform the length into a string.<br />               NtS=NumberToString(LengthOfBezier, BezierlengthText);<br />               //Add the unit.<br />               std::strcat(BezierlengthText, " mm");<br />          break;<br />          case 1://centimeters.<br />               LengthOfBezier=LengthOfBezier* 2.54 / 72.0/ scale;<br />               //Transform the length into a string.<br />               NtS=NumberToString(LengthOfBezier, BezierlengthText);<br />               //Add the unit.<br />               std::strcat(BezierlengthText, " cm");<br />          break;<br />          case 2://Inches.<br />               LengthOfBezier=LengthOfBezier/ 72.0 / scale;<br />               //Transform the length into a string.<br />               NtS=NumberToString(LengthOfBezier, BezierlengthText);<br />               //Add the unit.<br />               std::strcat(BezierlengthText, " in");<br />          break;<br />          case 3://Points.<br />               LengthOfBezier=LengthOfBezier/ scale;<br />               //Transform the length into a string.<br />               NtS=NumberToString(LengthOfBezier, BezierlengthText);<br />               //Add the unit.<br />               std::strcat(BezierlengthText, " pt");<br />          break;<br />          case 4://Picas.<br />               LengthOfBezier=LengthOfBezier/ 12.0/ scale;<br />               //Transform the length into a string.<br />               NtS=NumberToString(LengthOfBezier, BezierlengthText);<br />               //Add the unit.<br />               std::strcat(BezierlengthText, " pi");<br />          break;<br />          case 5://Meters.<br />               LengthOfBezier=LengthOfBezier * 0.0254 / 72.0 / scale;<br />               //Transform the length into a string.<br />               NtS=NumberToString(LengthOfBezier, BezierlengthText);<br />               //Add the unit.<br />               std::strcat(BezierlengthText, " m");<br />          break;<br />          default:<br />          break;<br />          }<br />     }<br /><br />JLG.
     
    |
    Mark as:
  • Currently Being Moderated
    Nov 4, 2009 5:46 AM   in reply to A. Patterson

    Re: getPathLength

     

    Any chance you could provide correct syntax or usage for this function? (or link to documentation, can't find in docs in AI scripting folder)

     

    Do I need to #Include any special suite or anything? (I'm a total newb to jsx although some experience with JS in other contexts)

     

    Is this for straight paths or curved also? One segment length or many?

     

    Thanks in advance for any advice

     

    Alastair

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 4, 2009 8:24 AM   in reply to wideEyedPupil

    JSX? If you're doing this via scripting, you may want to try the forum over here:

     

    http://forums.adobe.com/community/illustrator/illustrator_scripting

     

    This forum is for the C/C++ SDK

     

    As for what GetPathLength() returns, it returns the length of path, not individual segments, and yes it works for both flat & curved (bezier) paths.

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 5, 2009 5:08 AM   in reply to A. Patterson

    Thanks I realised after I posted this hit had come from SDK (even though I was searching Scripting folder!). Thanks.

     

    In JS the pathObjectCalledThis.length property worked effortlessly, even on curves and multi-segment lines.

     
    |
    Mark as:

More Like This

  • Retrieving data ...

Bookmarked By (0)