CafeJr 发表于 2022-7-5 16:18:44

拜托李,
 
你能帮我查一下这个密码吗?。。。
 
提前谢谢!。。。

marko_ribar 发表于 2022-7-5 16:20:42

CafeJr,试试这个,如果有什么问题就回答。。。现在,它应该适用于2个相反的开放二维曲线边界。。。
 

(defun c:snakefill-2curveboundaries (/ *adoc* odd even osm pea ch r lpl upl ip dir lplo uplo spc xl1 c1 xl2 c2 cl ss)

(defun odd (lst)
   (if lst (cons (car lst) (odd (cddr lst))))
)

(defun even (lst)
   (if lst (cons (cadr lst) (even (cddr lst))))
)

(vl-load-com)
(setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))

(setq osm (getvar 'osmode))
(setq pea (getvar 'peditaccept))
(setvar 'osmode 0)
(command "_.ucs" "w")
(initget 1 "Left-Right Up-Down")
(setq ch (getkword "\nChoose option (Left-Right / Up-Down) curve boundaries: "))
(initget 7)
(setq r (getdist "\nSpecify radius of snake turn: "))
(if (eq ch "Up-Down")
   (progn
   (setq lpl (car (entsel "\nPick lower curve boundary...")))
   (setq upl (car (entsel "\nPick upper curve boundary...")))
   (setq ip (getpoint "\nPick start point (\"left\" - Up-Down or \"bottom\" - Left-Right): "))
   (initget 1 "Up Down")
   (setq dir (getkword "\nChoose start direction (Up / Down): "))
   (if (eq dir "Up")
       (progn
         (command "_.offset" r lpl ip "")
         (setq lplo (entlast))
         (command "_.offset" r upl ip "")
         (setq uplo (entlast))
         (setq spc (vla-ObjectIdToObject *adoc* (vla-get-OwnerId (vlax-ename->vla-object lpl))))
         (setq c1 T c2 T k -3.0)
         (while (and c1 c2)
         (setq xl1 (vlax-invoke spc 'addxline (polar ip 0.0 (* r (setq k (+ k 4.0)))) (polar (polar ip 0.0 (* r k)) (* pi 0.5) 1.0)))
         (setq c1 (vlax-invoke xl1 'intersectwith (vlax-ename->vla-object uplo) acextendnone))
         (vla-delete xl1)
         (setq xl2 (vlax-invoke spc 'addxline (polar ip 0.0 (* r (+ k 2.0))) (polar (polar ip 0.0 (* r (+ k 2.0))) (* pi 0.5) 1.0)))
         (setq c2 (vlax-invoke xl2 'intersectwith (vlax-ename->vla-object lplo) acextendnone))
         (vla-delete xl2)
         (if c1 (setq cl (cons c1 cl)))
         (if (and c1 c2) (setq cl (cons c2 cl)))
         )
         (setq cl (reverse cl))
         (setq ss (ssadd))
         (foreach c (vl-remove nil (odd cl))
         (command "_.arc" (polar c pi r) (polar c (* pi 0.5) r) (polar c 0.0 r))
         (ssadd (entlast) ss)
         )
         (foreach c (vl-remove nil (even cl))
         (command "_.arc" (polar c pi r) (polar c (* pi -0.5) r) (polar c 0.0 r))
         (ssadd (entlast) ss)
         )
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p 0.0 r)) (vl-remove nil (odd cl))) (mapcar '(lambda (p) (polar p pi r)) (vl-remove nil (even cl))))
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p 0.0 r)) (vl-remove nil (even cl))) (mapcar '(lambda (p) (polar p pi r)) (vl-remove nil (cdr (odd cl)))))
         (command "_.line" ip (polar (car cl) pi r) "")
         (ssadd (entlast) ss)
       )
       (progn
         (command "_.offset" r lpl ip "")
         (setq lplo (entlast))
         (command "_.offset" r upl ip "")
         (setq uplo (entlast))
         (setq spc (vla-ObjectIdToObject *adoc* (vla-get-OwnerId (vlax-ename->vla-object lpl))))
         (setq c1 T c2 T k -3.0)
         (while (and c1 c2)
         (setq xl1 (vlax-invoke spc 'addxline (polar ip 0.0 (* r (setq k (+ k 4.0)))) (polar (polar ip 0.0 (* r k)) (* pi 0.5) 1.0)))
         (setq c1 (vlax-invoke xl1 'intersectwith (vlax-ename->vla-object lplo) acextendnone))
         (vla-delete xl1)
         (setq xl2 (vlax-invoke spc 'addxline (polar ip 0.0 (* r (+ k 2.0))) (polar (polar ip 0.0 (* r (+ k 2.0))) (* pi 0.5) 1.0)))
         (setq c2 (vlax-invoke xl2 'intersectwith (vlax-ename->vla-object uplo) acextendnone))
         (vla-delete xl2)
         (if c1 (setq cl (cons c1 cl)))
         (if (and c1 c2) (setq cl (cons c2 cl)))
         )
         (setq cl (reverse cl))
         (setq ss (ssadd))
         (foreach c (vl-remove nil (odd cl))
         (command "_.arc" (polar c pi r) (polar c (* pi -0.5) r) (polar c 0.0 r))
         (ssadd (entlast) ss)
         )
         (foreach c (vl-remove nil (even cl))
         (command "_.arc" (polar c pi r) (polar c (* pi 0.5) r) (polar c 0.0 r))
         (ssadd (entlast) ss)
         )
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p 0.0 r)) (vl-remove nil (odd cl))) (mapcar '(lambda (p) (polar p pi r)) (vl-remove nil (even cl))))
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p 0.0 r)) (vl-remove nil (even cl))) (mapcar '(lambda (p) (polar p pi r)) (vl-remove nil (cdr (odd cl)))))
         (command "_.line" ip (polar (car cl) pi r) "")
         (ssadd (entlast) ss)
       )
   )
   )
   (progn
   (setq lpl (car (entsel "\nPick right curve boundary...")))
   (setq upl (car (entsel "\nPick left curve boundary...")))
   (setq ip (getpoint "\nPick start point (\"left\" - Up-Down or \"bottom\" - Left-Right): "))
   (initget 1 "Left Right")
   (setq dir (getkword "\nChoose start direction (Left / Right): "))
   (if (eq dir "Left")
       (progn
         (command "_.offset" r lpl ip "")
         (setq lplo (entlast))
         (command "_.offset" r upl ip "")
         (setq uplo (entlast))
         (setq spc (vla-ObjectIdToObject *adoc* (vla-get-OwnerId (vlax-ename->vla-object lpl))))
         (setq c1 T c2 T k -3.0)
         (while (and c1 c2)
         (setq xl1 (vlax-invoke spc 'addxline (polar ip (* pi 0.5) (* r (setq k (+ k 4.0)))) (polar (polar ip (* pi 0.5) (* r k)) 0.0 1.0)))
         (setq c1 (vlax-invoke xl1 'intersectwith (vlax-ename->vla-object uplo) acextendnone))
         (vla-delete xl1)
         (setq xl2 (vlax-invoke spc 'addxline (polar ip (* pi 0.5) (* r (+ k 2.0))) (polar (polar ip (* pi 0.5) (* r (+ k 2.0))) 0.0 1.0)))
         (setq c2 (vlax-invoke xl2 'intersectwith (vlax-ename->vla-object lplo) acextendnone))
         (vla-delete xl2)
         (if c1 (setq cl (cons c1 cl)))
         (if (and c1 c2) (setq cl (cons c2 cl)))
         )
         (setq cl (reverse cl))
         (setq ss (ssadd))
         (foreach c (vl-remove nil (odd cl))
         (command "_.arc" (polar c (* pi -0.5) r) (polar c pi r) (polar c (* pi 0.5) r))
         (ssadd (entlast) ss)
         )
         (foreach c (vl-remove nil (even cl))
         (command "_.arc" (polar c (* pi -0.5) r) (polar c 0.0 r) (polar c (* pi 0.5) r))
         (ssadd (entlast) ss)
         )
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p (* pi 0.5) r)) (vl-remove nil (odd cl))) (mapcar '(lambda (p) (polar p (* pi -0.5) r)) (vl-remove nil (even cl))))
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p (* pi 0.5) r)) (vl-remove nil (even cl))) (mapcar '(lambda (p) (polar p (* pi -0.5) r)) (vl-remove nil (cdr (odd cl)))))
         (command "_.line" ip (polar (car cl) (* pi -0.5) r) "")
         (ssadd (entlast) ss)
       )
       (progn
         (command "_.offset" r lpl ip "")
         (setq lplo (entlast))
         (command "_.offset" r upl ip "")
         (setq uplo (entlast))
         (setq spc (vla-ObjectIdToObject *adoc* (vla-get-OwnerId (vlax-ename->vla-object lpl))))
         (setq c1 T c2 T k -3.0)
         (while (and c1 c2)
         (setq xl1 (vlax-invoke spc 'addxline (polar ip (* pi 0.5) (* r (setq k (+ k 4.0)))) (polar (polar ip (* pi 0.5) (* r k)) 0.0 1.0)))
         (setq c1 (vlax-invoke xl1 'intersectwith (vlax-ename->vla-object lplo) acextendnone))
         (vla-delete xl1)
         (setq xl2 (vlax-invoke spc 'addxline (polar ip (* pi 0.5) (* r (+ k 2.0))) (polar (polar ip (* pi 0.5) (* r (+ k 2.0))) 0.0 1.0)))
         (setq c2 (vlax-invoke xl2 'intersectwith (vlax-ename->vla-object uplo) acextendnone))
         (vla-delete xl2)
         (if c1 (setq cl (cons c1 cl)))
         (if (and c1 c2) (setq cl (cons c2 cl)))
         )
         (setq cl (reverse cl))
         (setq ss (ssadd))
         (foreach c (vl-remove nil (odd cl))
         (command "_.arc" (polar c (* pi -0.5) r) (polar c 0.0 r) (polar c (* pi 0.5) r))
         (ssadd (entlast) ss)
         )
         (foreach c (vl-remove nil (even cl))
         (command "_.arc" (polar c (* pi -0.5) r) (polar c pi r) (polar c (* pi 0.5) r))
         (ssadd (entlast) ss)
         )
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p (* pi 0.5) r)) (vl-remove nil (odd cl))) (mapcar '(lambda (p) (polar p (* pi -0.5) r)) (vl-remove nil (even cl))))
         (mapcar '(lambda (p1 p2) (progn (command "_.line" p1 p2 "") (ssadd (entlast) ss))) (mapcar '(lambda (p) (polar p (* pi 0.5) r)) (vl-remove nil (even cl))) (mapcar '(lambda (p) (polar p (* pi -0.5) r)) (vl-remove nil (cdr (odd cl)))))
         (command "_.line" ip (polar (car cl) (* pi -0.5) r) "")
         (ssadd (entlast) ss)
       )
   )
   )
)
(setvar 'peditaccept 1)
(command "_.pedit" "m" ss "" "j" "" "")
(entdel lplo)
(entdel uplo)
(setvar 'osmode osm)
(setvar 'peditaccept pea)
(command "_.ucs" "p")
(princ)
)

(defun c:sf-2c nil (c:snakefill-2curveboundaries))
(prompt "\n...Run with 'SF-2C'...")
(princ)
M.R。

BIGAL 发表于 2022-7-5 16:26:12

Marko_ribar非常非常好新的,可以解决

marko_ribar 发表于 2022-7-5 16:28:49

谢谢你,比格尔。。。我将附上更完整的版本-它确定拾取点的位置,并根据该位置继续将蛇绘制到曲线之间区域的另一侧。。。
 
M、 R。
蛇形填充-2曲线边界。lsp

CafeJr 发表于 2022-7-5 16:30:34

 
哇。。。非常感谢Marko_ribar!!!。。。这正是我需要的!!!。。。我很感激!!!。。。它的工作,因为我需要好!。。。

CafeJr 发表于 2022-7-5 16:33:27

 
Marko_ribar大师,
 
我不知道这是否是另一个线程,但是,我想这段代码将是一个“esay”代码,我真的很震惊!这是一个很大的代码,不是那么容易!!!。。。那么,对于这个代码,遵循边界平面图的一条参考线,如图所示,有可能吗?
 
非常感谢!!!。。。我真的很感激!!!。。。
 

marko_ribar 发表于 2022-7-5 16:37:11

如果第三个边界是一个弧,我认为这是可能的。。。但弯曲必须在第一和第二侧边界之间-像圆这样的东西是不可能的。。。我认为这是一个在垂直向上/向下方向上,而不是偏移第三个边界的多个副本的示例。。。正如我所说的,如果它比它可能的弧。。。原理与上面发布的代码相同。。。只需在水平/垂直方向上与圆弧相交,而不需要连接线。。。我认为你有很多信息可以自己构建这个。。。如果你愿意,你可以向我们展示你的结果。。。我们很高兴看到它能起作用。。。请记住,在搜索边弧的中心时,我会使用“intersectwith method with option acextendthisentity(弧是第一个VLA-OBJECT)。。。
 
M、 R。

CafeJr 发表于 2022-7-5 16:40:38

 
事实上,边界线是一个区域的普林斯极限,我必须填充它,就像下一张图片。。。我试着按照一些规则用“蛇线”填充它。我可以说这只是绘画的第一步!但最糟糕的是。。。
 

 
 
编辑:Opsss。。。对不起,但是,你是要我给你看结果吗?
我不知道该怎么做,我正在研究另一种方法,但试图编译另一种代码!。。。

marko_ribar 发表于 2022-7-5 16:45:44

这是Lisp程序。。。它将圆弧用作第三个边界。。。第一和第二侧边界必须是水平或垂直曲线。。。
 
我没有使用acextendthisentity,但必须重新创建半圆弧。。。
 
M、 R。
 
[编辑:我不知道为什么,但它在2012年不起作用,在2014年起作用]。。。
 
[EDIT2:现在可以在版本上使用
snakefill-2lineboundaries-arc-entmake arcs。lsp

CafeJr 发表于 2022-7-5 16:47:32

 
马可·里巴,非常感谢你帮助我!!!。。。几乎是这样,在最后两张图片上,你可以看到要遵循的线是边界线(在这种情况下是一条水平线),而不是绘制一条弧,可以选择该线作为参考线?在那之后做从上侧到下侧的偏移,用圆弧闭合。。。我试着编译代码,比如在这种情况下,在做了一个“pedit”连接这些对象之后,偏移了直线和圆弧。。。
页: 1 [2]
查看完整版本: 用“或”填充一个区域