Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Not trivial problem or How to draw it?

3 REPLIES 3
SOLVED
Reply
Message 1 of 4
danglar
840 Views, 3 Replies

Not trivial problem or How to draw it?

I need to separate polyline by point on it and add a curve from a polyline to this point like it drawn on picture with option to reverse this curve and join polyline after all..

Is it possible to do it programmatically (via lisp function)?

Any help or suggestions will be very appreciated

qqq.jpg

3 REPLIES 3
Message 2 of 4
Kent1Cooper
in reply to: danglar

Would this always be in a single-line-segment  Polyline as in the picture [which shouldn't be too difficult], or would it sometimes be in segment within a longer Polyline [much more complicated, I think]?

Kent Cooper, AIA
Message 3 of 4
phanaem
in reply to: danglar

@danglar

AddVertex.gif

 

Try this lisp. Tested in WCS and UCS, but not for 3D rotated polylines; new vertex only on straight segments, IF there is enough space to draw the arcs. Also, feel free to add your favorite error trap.

;Add vertex to polyline
;Stefan M. 30.10.2018
(defun c:adv ( / *error* add_vertex e p1 p2 d a b1 b2 u q g)
;;;  (setq *error* (err))
  (defun add_vertex (e a p)
    (vla-addvertex e a
      (vlax-safearray-fill
        (vlax-make-safearray vlax-vbDouble '(0 . 1))
        (list (car p) (cadr p))
      )
    )
  ) 
  (if
    (and
      (setq e (ssget "_+.:S:L" '((0 . "LWPOLYLINE"))))
      (setq e (vlax-ename->vla-object (ssname e 0)))
    )
    (while
      (setq p1 (getpoint "\nSpecify point to add vertex: "))
      (setq p1 (trans p1 1 0)
            p2 (vlax-curve-getclosestpointto e p1)
            a (fix (vlax-curve-getparamatpoint e p2))
      )
      (if
        (and
          (equal (vla-getbulge e a) 0.0 1e-8)
          (setq d (distance p1 p2)
                b1 (vlax-curve-getpointatparam e a)
                b2 (vlax-curve-getpointatparam e (1+ a))
          )
          (and
            (> d 0)
            (> (distance b1 p2) d)
            (> (distance b2 p2) d)
          )
          (setq u (angle b2 b1)
                q (<
                    (* (- (cadr p1) (cadr b1)) (cos u))
                    (* (- (car  p1) (car  b1)) (sin u))
                  )
                g (* (if q 1 -1) (1- (sqrt 2)))
          )
        )
        (progn
          (add_vertex e (+ 1 a) (polar p2 (angle p2 b1) d))
          (add_vertex e (+ 2 a) p1)
          (add_vertex e (+ 3 a) (polar p2 (angle p2 b2) d))
          (vla-setbulge e (+ 1 a) g)
          (vla-setbulge e (+ 2 a) g)
        )
      )
    )
  )
;;;  (*error* nil)
  (princ)
)
     
Message 4 of 4
danglar
in reply to: phanaem

Wow   phanaem  !

It's genius! I thought about how to reverse curves depends of point destination and how to join segments after transforming, but here all my questions find appropriative answer

Thank you Stefan M  for your master and brief solution                        

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

AutoCAD Inside the Factory


Autodesk Design & Make Report