I am trying to draw a line between two lines and I put together the following. It works great if the start/end points are perpendicular to each other. How do I solve if line one start point is in a positive direction and line two is in a negative direction?
(defun c:test ()
(setq L1 (car (entsel "\nSelect the first line: "))
L2 (car (entsel "\nSelect the second line: "))
)
(setq P1 (cdr (assoc 10 (entget L1)))
P2 (cdr (assoc 11 (entget L1)))
P3 (cdr (assoc 10 (entget L2)))
P4 (cdr (assoc 11 (entget L2)))
)
(setq D1 (/ (distance P1 P3) 2)
D2 (/ (distance P2 P4) 2)
)
(setq A1 (angle P1 P3)
A2 (angle P2 P4)
)
(setq P5 (polar P1 A1 D1)
P6 (polar P2 A2 D2)
)
(command "LINE" P5 P6 "")
)
Solved! Go to Solution.
Solved by Kent1Cooper. Go to Solution.
Solved by pbejse. Go to Solution.
Solved by _Tharwat. Go to Solution.
@smaher12 wrote:
....I was just thinking, what if you wanted to include polylines???
You could use the Bisector.lsp routine I posted a link to in Message 2, whose BI command will work with virtually anything that's straight. It results in an Xline, which you can then Break or Trim as needed.
If you really want a Line, the routine would need to check for entity type, allowing Polylines as well as Lines. If it's a Polyline, it would need to check that you picked it on a line segment rather than an arc segment, which can be done by checking whether Osnap Center returns anything. And if you did, it would need to find the vertices on either side of the pick location. That can certainly all be done, if the Bisector approach doesn't do it for you.
@Kent1Cooper wrote:
@smaher12 wrote:
....I was just thinking, what if you wanted to include polylines???
... That can certainly all be done....
For example, as in the attached upgraded version of LineBetween.lsp.
Kent1Cooper wrote:
For example, as in the attached upgraded version of LineBetween.lsp.
That is awesome! I can't believe it. Thank you very much. Let me ask you, do you typically have (vl-load-com) in your startup acaddoc.lsp?
@smaher12 wrote:
That is awesome! I can't believe it. Thank you very much. Let me ask you, do you typically have (vl-load-com) in your startup acaddoc.lsp?
You're welcome -- that was kind of fun to work out, though it didn't take much, because I already had lots of the pieces in other routines.
I don't have (vl-load-com) in acaddoc.lsp, but we use the Architectural Desktop overlay, which I think must include something that loads it. That means I don't need to include it in routines in order for them to work when I test them, which therefore means I pretty regularly forget to include it in things I post. Sorry about that -- I'll keep trying to remember....
Hi
I need a lisp for draw a line(with z) between two feature line.
I look forward to hearing from you.
Thanjs
@Anonymous wrote:I need a lisp for draw a line(with z) between two feature line.
....
If a "feature line" is a special kind of object in some overlay program such as for civil engineering, I won't be able to help you, at least I can't test any change to the routine. I might be able to suggest something if you can post the entity data list for a typical one [type (entget (car (ensel))) and select one, and copy what is returned].
If a "feature line" is just a particular usage of a regular Line or Polyline, the routine attached to Message 22 should do what you want, assuming you want one Line as a result, and not, for instance, multiple Lines [or another Polyline] between all segments of two Polylines.
If you mean something other than those two possibilities, post a more detailed description of what you want to do, perhaps with an image or drawing if that helps explain it.
Here's a challenge, I'd like to automate drawings a line between multiple sets of lines, to essentially convert a double line floor plan to single line. I'm trying to mess with the lisp posted here but having some difficulty.
One of the solutions posted by pbejse ( l2.lsp )worked well but it still allows me to pick only 2 lines at a time.
The difficulty comes in situation like the upper edge in your sample drawing. In both the left and right portions (either side of the window), there's one outside line that encompasses the extent of two inside lines. If those six lines are chosen in a collective selection, figuring out 1) that two mid-width Lines are to be the result, and 2) the proper extent for each of them, is going to be a real challenge for a routine to calculate. Maybe not impossible, but difficult. And that's a simple condition -- there's the potential for any various numbers of lines to make up one side of a wall, and some different number of lines the other, with potentially none of their endpoints being across from each other except maybe at the extreme ends, but all wanting to be represented in the result by a single mid-line along the whole wall.
It seemed like a simple concept at first, when I gave it a shot I just couldn't get anything to work. Thanks for the input.
Just a thought, my intent was to be selective about the lines to be picked, and not just one sweeping selection. I wanted to be able to select maybe 10-20 sets of lines, all the while staying away from any geometry that was meant to represent doors or windows. Is that doable?
This works really great, I was wondering, could this be modified to allow me to select more than one set of parallel lines? Another 7 or 8 sets would make this exactly what I need.
Maybe add a 'loop' until done picking (2) at a time ?
(While lines
....
); while
Where lines is the selection set.
@ec-cad ,
Smart idea. I would still use entsel because some dimwit would otherwise likely select more than 2 lines with a crossing. Plus, immediately after the 2nd pick you can test for parallelity (Fewer than 0.01 occurrences per million words in modern written English).
John F. Uhden
Years ago wrote get wall sizes uses a simple drag over lines to work out perp distances, the idea being to reset wall sizes to an existing drawn sizes. As the walls are part of a bigger program the wall layers are not the same having like wall-1, wall-2 etc this simplifies the automation request.
So can drag a line over say 8 lines sort into matched pairs and work out c/l. Repeating the line drag over for multiple walls.
The issue is walls are 2 lines or 4 ? Thats where layers come in handy.
Added to do list.
Put something together but need 2 solutions a single segment or a multi segment, the latter needs a drag over twice, near opposite ends.
Just a side note have the reverse convert single line to 2 line or 4 lines walls with option Left, Right, or Centre.
This is single segment, when dragging over do near one end this sorts out the line directions.
; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/line-between-two-lines/td-p/3781918/page/2
(defun c:lineinwall ( / oldsnap pt1 pt2 lent ss obj obj2 lst dist start end d1 d2 x)
(setq oldsnap (getvar 'osmode))
(setvar 'osmode 0)
(while (setq pt1 (getpoint "\nPick 1st point "))
(setq pt2 (getpoint pt1 "\nPick 2nd point "))
(setq pts (list pt1 pt2))
(setq ss (ssget "F" pts '((0 . "LINE"))))
(command "line" pt1 pt2 "")
(setq lent (entlast))
(setq obj2 (vlax-ename->vla-object lent))
(setq lst '())
(repeat (setq x (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
(setq intpt (vlax-invoke obj2 'intersectWith obj acExtendnone))
(setq dist (distance pt1 intpt))
(setq start (vlax-curve-getstartPoint obj))
(setq end (vlax-curve-getEndPoint obj))
(setq d1 (distance intpt start) d2 (distance intpt end))
(if (< d1 d2)
(progn
(setq tmp start)
(setq start end)
(setq end tmp)
)
)
(setq lst (cons (list dist start end) lst))
)
(setq lst (vl-sort lst '(lambda (x y) (< (car x)(car y)))))
(command "erase" lent "")
(setq x 0)
(repeat (/ (length lst) 2)
(setq start1 (cadr (nth x lst)) start2 (cadr (nth (1+ x) lst)))
(setq mp1 (mapcar '* (mapcar '+ start1 start2) '(0.5 0.5)))
(setq end1 (caddr (nth x lst)) end2 (caddr (nth (1+ x) lst)))
(setq mp2 (mapcar '* (mapcar '+ end1 end2) '(0.5 0.5)))
(command "line" mp1 mp2 "")
(setq x (+ X 2))
)
)
(setvar 'osmode oldsnap)
(princ)
)
(c:lineinwall)
Being in the northern hemisphere, I'm really not familiar with walls except that interior walls usually have vertical studs with sheetrock applied to each side. Exterior walls also have vertical studs with sheetrock applied to the inside and sheathing and siding applied to the outside. Those blasted architectural plans also include the foundation lines and sometimes even the roof gutters. Even if I have a DWG or PDF I have to redraw the exterior following the dimensions labeled thereon because I don't know which endpoints to pick.
John F. Uhden
Here in Aus the most common exterior walls shown as 4 lines is, internal plaster sheet to studs, sarking and /or insulation, external wall is brick veneer, or a wall material, even corrugated iron. Internal walls would be 2 lines with typically plaster both sides.
Re picking points the house in the image is drawn with strict layer control you draw objects on a preset layer. So isolate say external wall layer.
Can't find what you're looking for? Ask the community or share your knowledge.