乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 45|回复: 19

[编程交流] 在多段线内插入圆

[复制链接]

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 14:25:04 | 显示全部楼层 |阅读模式
大家好,我找到并修改了一个适合我需要的旧代码。
 
 
====================================================================================================
 
 
编辑:GP_最初编写了起始代码。谢谢你告诉我,我真的不知道。
 
您可以在此处找到原始代码:
 
http://www.cad3d.it/forum1/showthread.php?38359-Disignare cerchi all interno di un Polilina/page2&p=319854#post319854
 
====================================================================================================
 
 
 
不幸的是,有时速度很慢。。
我想问的是,是否有更好的方法来实现这一结果
 
 
 
 
  1. (defun dcer ( / *error* passo Dcon Dcon* dmax p_or d2 p L1 L2 Lc cont tot e1 ret EL EL* LIN n Lc del)
  2.    
  3. ;   richiesta distanza dal contorno   
  4. ;*************************************
  5.    (setq Rd 2)   
  6. ;*************************************
  7.    
  8.    (setq olderr *error* *error* myerror_**)
  9.    
  10.    (m_v (list "cmdecho" "hporigin" "hpbound" )) ;estrare le variabili e ne fa una lista (("cmdecho".0) ("hporigin" . ...) ..)
  11.   ;hporigin Imposta il punto di origine del tratteggio per i nuovi modelli di tratteggio rispetto all'UCS corrente.
  12.   ;Controlla il tipo di oggetto creato dai comandi TRATTEGGIO e CONTORNI. 0 Regione 1 polilinea
  13.    
  14.    (setvar 'cmdecho 0)
  15.    (command "_.undo" "_begin")
  16.    (prompt "\n ") (prompt "\n ")
  17. (IF (= "S" (substr (dcl-Control-GetText Cobiax/Main/tipo_alleggerimento) 1 1))
  18.    (progn
  19.    (setq diam (substr (dcl-Control-GetText Cobiax/Main/tipo_alleggerimento) 7 3))
  20.    (cond
  21.        ( (= diam "315") (setq passo (* scala 0.35)) )
  22.    )
  23.    )
  24.    (progn
  25.      (setq diam (substr (dcl-Control-GetText Cobiax/Main/tipo_alleggerimento) 3 3))
  26.    (cond
  27.        ( (= diam "315") (setq passo (* scala 0.35)) )
  28.        ( (= diam "360") (setq passo (* scala 0.40)) )
  29.        ( (= diam "405") (setq passo (* scala 0.45)) )
  30.        ( (= diam "450") (setq passo (* scala 0.50)) )
  31.       
  32.        )
  33.      )
  34.    )
  35. (IF (= "D" (substr (dcl-Control-GetText Cobiax/Main/tipo_alleggerimento) 1 1))
  36.    (progn
  37.      (setq diam "315"
  38.            passo (* scala 0.365))
  39.      )
  40.    )
  41.    
  42.    (setq Dcon (/ passo 2.)) ;raggio della sfera?
  43.    (setq Dcon* (* scala 1000.0)  )  
  44.    (setq p_or (getpoint "\nOrigine Campitura ")) ;punto origine campitura
  45.    (setq d2 (* scala (/ (atof diam) 2000.0))) ;boh?!
  46.    (setq p_or (mapcar '+ p_or (list Dcon Dcon 0.0))) ;sposto il punto dal vertice all'interno così da avere una sfera interna
  47.    (setq p (getpoint "\nPunto Interno "))
  48.    
  49.    (setvar 'hporigin p_or) ;setta l'origine della capitura al punto individuato
  50.    (setvar 'hpbound 1)     ;Controlla il tipo di oggetto creato dai comandi TRATTEGGIO e CONTORNI. 0 Regione 1 polilinea
  51.   
  52.    (setq LIN (ssadd))
  53.    (setq tot (ssadd))
  54.    (setq EL* (entlast))
  55.    (_CreateLayer "Bordi" 253 "" 0 0)
  56.    (setq OLD_LAYER (getvar 'clayer))
  57.    (_SetCLayer "Bordi")
  58.    (sblocca_layers)
  59. ;;;    (command "_-bhatch" "_L" "Bordi" "_a" "_r" "_y" "_i" "_y" "" "_p" "_u" "0" passo "_y" p "" )
  60.     (command "_-bhatch" "_a" "_r" "_y" "_i" "_y" "" "_p" "_u" "0" passo "_y" p "" ) ;acad 2009
  61.    (_SetCLayer OLD_LAYER)
  62.    ;(setq P_linea (entlast))
  63.    (while EL*
  64.        (if (setq EL* (entnext EL*)) (ssadd EL* tot))        
  65.    )
  66.    (repeat (setq n (sslength tot))
  67.        (setq e1 (ssname tot (setq n (1- n))))
  68.        (if (= (cdr (assoc 0 (entget e1))) "HATCH")
  69.            (setq ret e1)
  70.            (setq cont (cons e1 cont))
  71.        )
  72.    )
  73.    (setq EL (entlast))     
  74.    (command "_explode" ret)
  75.    
  76.    (setq LIN (ssadd))
  77.    (while EL
  78.        (if (setq EL (entnext EL)) (ssadd EL LIN))        
  79.    ) ;seleziona le linee
  80.    ;gruppo di selezione -> lista
  81.    (repeat  (setq n (sslength LIN))
  82.        (setq L1 (cons (ssname LIN (setq n (1- n))) L1))
  83.    )
  84.    (setq L2 L1)
  85.   
  86.    (mapcar
  87.        '(lambda (a)
  88.             (mapcar
  89.                 '(lambda (b)
  90.                      (ii a b)
  91.                  )
  92.                  (setq L2 (cdr L2))
  93.             )
  94.         )
  95.        L1
  96.    )
  97.    (vl-cmdf "._erase" LIN "")
  98.    (setq EL (entlast))
  99.    (setq lista_cerchi (list))
  100.    (mapcar
  101.        '(lambda (x)
  102.           (setq lista_cerchi (append lista_cerchi (list
  103.             (ENTMAKEX (LIST
  104.                        '(0 . "CIRCLE")
  105.                         (cons 8 nome) ;layer
  106.                  
  107.                        (cons 62 (atoi colore))
  108.                        (CONS 10 x)
  109.                        (CONS 40 d2)))
  110.             )))
  111.         )
  112.         Lc
  113.    )
  114. )   
  115. ;*************************************************************************
  116. (defun m_v (va)
  117.    (setq varsis '())
  118.    (repeat (length va)
  119.        (setq varsis (append varsis
  120.                             (list (cons (car va) (getvar (car va))))
  121.                     )
  122.        )
  123.        (setq va (cdr va))
  124.    )
  125. )
  126. ;*************************************************************************
  127. (defun r_v ()
  128.    (repeat (length varsis)
  129.        (setvar (caar varsis) (cdar varsis))
  130.        (setq varsis (cdr varsis))
  131.    )
  132. )
  133. ;*************************************************************************
  134. (defun ii (ent1 ent2 / int )
  135.    (setq ent1 (vlax-ename->vla-object ent1))
  136.    (setq ent2 (vlax-ename->vla-object ent2))
  137.    (setq int (vlax-invoke ent1 'IntersectWith ent2 acExtendNone))
  138.    (cond (int
  139.         (repeat (/ (length int) 3)
  140.             (setq Lc (cons (list (car int)(cadr int)(caddr int)) Lc))
  141.             (setq int (cdddr int))
  142.         )
  143.     )
  144.    )
  145. )
  146. ;*************************************************************************
  147. (defun listavertici ( poly / list_vert)
  148.    (mapcar '(lambda (x)
  149.                 (if (eq (car x) 10)
  150.                     (setq list_vert (cons (trans (list (cadr x) (caddr x)) 0 1) list_vert))
  151.                 )
  152.             )
  153.             (entget poly)
  154.    )
  155.    list_vert
  156. )

我正在使用OPENDCL,因此如果没有一些更改,您就无法运行代码(如果需要的话,我会这样做)。
 
 
这里的想法是创建一个图案填充,将其分解并在交点处插入一个圆。如果圆穿过边界线,它将被删除。
 
 
正如你所看到的,它非常慢。。。
 
 
谢谢你的帮助!
丹尼斯
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 14:30:22 | 显示全部楼层
这些圆圈代表什么?
回复

使用道具 举报

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 14:31:54 | 显示全部楼层
 
 
你好
 
 
它们表示轻质钢筋混凝土板的空心成型器模块的位置。

                               
登录/注册后可看大图
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 14:37:19 | 显示全部楼层
凉的
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 14:39:22 | 显示全部楼层
你的网格总是在0旋转吗?
回复

使用道具 举报

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 14:43:31 | 显示全部楼层
 
 
没有,但我更改了其他角度的全局UCS
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 14:44:24 | 显示全部楼层
一种简单的方法是选择表示内边界的pline,如果需要,可以使用bpoly。边界框柱脚选择我用作第一个圆位置的起点,在我的情况下,它是混凝土面板,在x和Y方向排列,因此它覆盖了所有柱脚,比柱脚稍大,然后非常简单地剪裁/修剪所有外部圆删除它们,再次重新修剪,这次任何接触柱脚的圆都会被删除。该方法用于带圆弧的PLINE。
 
 
你需要一点图层控制,所以在修剪时不要抹掉应该留下的东西。这是非常快的代码最初是写像20年前,所以个人电脑当时没有那么快。这是一段我没有版权的代码,我无论如何都需要重做。我想我在poly“WP”中找到的对象上使用了chprop,所以外面就像layer1在layer2里面,只是在更改后删除layer1
 
 
我也会考虑使用UCS选择一条边等来定位,这可能在球的位置上更经济。
 
  1. I did manually all the steps in a new lisp that has not been coded yet.
  2. circle
  3. array circle
  4. chprop wp picked the inside points and changed layer
  5. layiso outside circles and erased
  6. unlayiso
  7. all done.
  8. Ps arcs can be taken into account by making facets when doing Chprop WP to increase accuracy.
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 14:49:14 | 显示全部楼层
这是第1版,我必须添加一些东西并加快制作速度,它只需要一个pline就可以工作,因此,如果你有图像中的对象,只需使用bpoly制作一个内部pline,该pline将被要求提供注释弧在pline中是可以的。这有点慢,但测试时我绕了几千圈。我需要正确地添加控制点,我希望您在运行之前为网格选择一条边作为正方形,因此请执行Bpoly和UCS OB。需要一个trans function ver 2。
 
  1. ; get circles with closed pline example
  2. ; By Alan H july 2018
  3. ; program starts here
  4. (defun objectswithin ( / obj pt i co-ords xy co-ordsxy rad spc ll ur xmany ymany ss )
  5. (setq obj (vlax-ename->vla-object (car (entsel "\nplease pick pline"))))
  6. (vla-getboundingbox obj 'll 'ur)
  7. (setq ll(vlax-safearray->list ll))
  8. (setq ur (vlax-safearray->list ur))
  9. (setq co-ords (vlax-safearray->list(vlax-variant-value (vlax-get-property     obj     "Coordinates" ))))
  10. (setq I 0)
  11. (repeat(/ (length co-ords) 2)
  12. (setq xy (list (nth i co-ords)(nth (+ I 1) co-ords) ))
  13. (setq co-ordsxy (cons xy co-ordsxy))
  14. (setq I (+ I 2))
  15. )
  16. (setq pt (getpoint "Pick circle point"))
  17. (setq rad (getreal "Enter radius"))
  18. (setq spc (getreal "Enter spacing"))
  19. (if (not(tblsearch "layer" "tempcircle1") )
  20. (command "-layer" "M" "tempcircle1" "c" 6 "tempcircle1" "")
  21. )
  22. (if (not (tblsearch "layer" "tempcircle2") )
  23. ( command "-layer" "M" "tempcircle2" "c" 2 "tempcircle2" "")
  24. )
  25. (setq oldlay (getvar 'clayer))
  26. (setvar 'clayer "tempcircle1")
  27. (setq ll (list (- (car ll) rad) (- (cadr ll) rad)))
  28. (setq ur (list (+ (car ur) rad) (+ (cadr ur) rad)))
  29. (setq xmany   (fix (/ (- (car ur)(car ll)) spc)))
  30. (setq ymany   (fix(/ (- (cadr ur)(cadr ll)) spc)))
  31. (command  "circle" ll rad)
  32. (setq  obj2 (entlast))
  33. (command "-array"  obj2 ""  "R" ymany xmany spc spc )
  34. ; selection set of circles within polygon
  35. (setq ss (ssget "WP" co-ordsxy (list (cons 0 "Circle"))))
  36. (princ (sslength ss)) ; this is howmany Circles
  37. (command "chprop" ss "" "la" "tempcircle2" "")
  38. (command "layiso" obj2 "")
  39. (command "erase" "w" (getvar 'extmin)(getvar 'extmax) "")
  40. (command "layuniso" )
  41. (setvar 'clayer oldlay)
  42. )
  43. (objectswithin)

152514fq00kk3kpky08w07.jpg
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 14:51:43 | 显示全部楼层
(用我的眼睛)眨了几下眼睛,它是怎么工作的,但后来灯亮了:-)可能有更多的路通往罗马,但我认为你做得很好,比格尔!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 14:55:58 | 显示全部楼层
现在在UCS版本上工作,因为它是带钢筋的混凝土,所以会有一条边,你可以从边开始,另一项是你指定圆的起点,在上面的图像中,你说reo在200x200,一个球,然后每隔200mm,所以需要一个定义网格图案的起点。此外,将entmake视为阵列速度非常慢,与手动相比,不确定原因。发现边界框必须在UCS中转换的问题。找到翻译的代码,代码很长。因此,只需在pline上使用最小-最大例程,因为它将在当前UCS内工作。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 23:24 , Processed in 1.054793 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表