乐筑天下

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

[编程交流] 按块替换圆

[复制链接]

7

主题

37

帖子

30

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:23:27 | 显示全部楼层 |阅读模式
嗨,朋友们,
是否有任何lisp以块替换选定的圆。。。。。。。。。。。。
请帮帮我
谢谢
马尼
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-5 17:31:53 | 显示全部楼层
试试看
  1. ;;; Command changes the set of primitives for the selected primitive.
  2. ;;; Examples:
  3. ;;; Replacement of some other blocks.
  4. ;;; Replacement blocks or dots circles.
  5. ;;; Replacement of some other titles.
  6. ;;;
  7. ;;; First you need to select a sample, and then specify replaceable objects.
  8. ;;; Box is in the center is restricted (bounding) rectangle of old objects.
  9. ;;; New objects are inserted into the layers that Belonged to which the old objects.
  10. ;;; Supports pre-selection.
  11. (defun c:frto(/ ACTDOC COPOBJ ERRCOUNT EXTLST
  12.       EXTSET FROMCEN LAYCOL MAXPT CURLAY
  13.       MINPT OBJLAY OKCOUNT OLAYST
  14.       SCLAY TOCEN TOOBJ VLAOBJ *ERROR* ASK)
  15. (vl-load-com)
  16. (defun *ERROR*(msg)
  17.    (if olaySt (vla-put-Lock objLay olaySt)); end if
  18.    (vla-EndUndoMark actDoc)(princ)); end of *ERROR*
  19. (defun GetBoundingCenter(vlaObj / blPt trPt cnPt)
  20. (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
  21.      (setq blPt(vlax-safearray->list minPt)
  22.      trPt(vlax-safearray->list maxPt)
  23.      cnPt(vlax-3D-point
  24.      (list
  25.            (+(car blPt)(/(-(car trPt)(car blPt))2))
  26.            (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
  27.            (+(caddr blPt)(/(-(caddr trPt)(caddr blPt))2)) ;_<<< Заменили
  28.            )))); end of GetBoundingCenter
  29. (setq extSet(ssget "_I"))
  30. (while (not (setq toObj(entsel "\n+++ Select source object (sample) -> ")))
  31.   (princ "\nSource objects isn't selected!"))
  32. (if(not extSet)
  33.    (progn
  34.      (princ "\n+++ Select destination (replaceable) objects and press Enter <- ")
  35.      (setq extSet(ssget "_:L")))); end if
  36. (if(not extSet)(princ "\nDestination objects isn't selected!")); end if
  37. (if (and extSet toObj)
  38.    (progn
  39.      (initget "Yes No")
  40.      (setq ask (getkword "\nRemove destination object [Yes/No] <No>:"))
  41.      (setq actDoc (vla-get-ActiveDocument(vlax-get-Acad-object))
  42.      layCol (vla-get-Layers actDoc)
  43.      extLst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp
  44.                     (mapcar 'cadr(ssnamex extSet))))
  45.      vlaObj (vlax-ename->vla-object(car toObj))
  46.      objLay (vla-Item layCol (vla-get-Layer vlaObj))
  47.      olaySt (vla-get-Lock objLay)
  48.     fromCen (GetBoundingCenter vlaObj)
  49.      errCount 0  okCount 0); end setq
  50.      (vla-StartUndoMark actDoc)
  51.      (foreach obj extLst
  52.        (setq toCen (GetBoundingCenter obj)
  53.              scLay (vla-Item layCol (vla-get-Layer obj)));end setq
  54. (if(/= :vlax-true(vla-get-Lock scLay))
  55.    (progn
  56.    (setq curLay(vla-get-Layer obj))
  57.    (vla-put-Lock objLay :vlax-false)
  58.    (setq copObj(vla-copy vlaObj))
  59.    (vla-Move copObj fromCen toCen)
  60.    (_kpblc-ent-properties-copy obj copObj)
  61.    (vla-put-Layer copObj curLay)
  62.    (vla-put-Lock objLay olaySt)
  63.    (if (= ask "Yes")(vla-Delete obj))
  64.    (setq okCount(1+ okCount))
  65.    ); end progn
  66.    (setq errCount(1+ errCount))
  67.    ); end if
  68. ); end foreach
  69.      (princ (strcat "\n" (itoa okCount) " were changed. "
  70.    (if(/= 0 errCount)(strcat (itoa errCount) " were on locked layer! ")  "")))
  71.      (vla-EndUndoMark actDoc)); end progn
  72.    (princ "\nSource object isn't selected! ")
  73.    ); end if
  74. (princ)); end of c:frto
  75. (defun _kpblc-ent-properties-copy (source dest)
  76. (foreach prop   '("Angle" "Layer" "Linetype" "LinetypeScale" "Lineweight"
  77.        "Normal" "PlotStyleName" "Thickness" "Color" "Visible"
  78.        "Closed" ;|"ConstantWidth" ; не копируется|; "Elevation" "LinetypeGeneration"
  79.        "LinetypeScale" ;|"StartAngle" "EndAngle" ; не копируются|; "Alignment"
  80.        "Backward" "Height" "ObliqueAngle" "Rotation" "ScaleFactor" "StyleName"
  81.        "TextGenerationFlag"  "TextHeight"  "UpsideDown"  "AttachmentPoint" "BackgroundFill"
  82.        "DrawingDirection"  "LineSpacingDistance" "LineSpacingFactor" "LineSpacingStyle"  "Width"
  83.        "XScaleFactor" "YScaleFactor" "ZScaleFactor" ;| Viewport|; "ArcSmoothness" "CustomScale"
  84.        "Direction" "DisplayLocked"  "GridOn" "LensLength" "ModelView" "ShadePlot" "SheetView"
  85.        "SnapBasePoint" "SnapOn" "SnapRotationAngle" "StandardScale" "Target"  "TwistAngle"
  86.        "UCSIconAtOrigin"   "UCSIconOn"     "UCSPerViewport" "ViewportOn")
  87. (if (and (vlax-property-available-p source prop)(vlax-property-available-p dest prop t))
  88. (vl-catch-all-apply
  89.    '(lambda ()(vlax-put-property dest prop (vlax-get-property source prop))))
  90.   )
  91.   )
  92. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:35:01 | 显示全部楼层
谢谢VVA和李
这两种代码都运行良好。。。。。这对我有很大帮助。。。。。。。。。
谢谢你
 
当做
马尼语:):)
回复

使用道具 举报

7

主题

37

帖子

30

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 17:42:50 | 显示全部楼层
不客气,兄弟
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:44:02 | 显示全部楼层
嗨,李,
只是想知道你会如何改变它来取代甜甜圈?
我试图修改代码,但无法使其正常工作。
 
谢谢
史蒂夫
回复

使用道具 举报

0

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 17:51:04 | 显示全部楼层
甜甜圈不是一种实体;“圆环”命令将生成由两条圆弧组成的粗多段线。所以,你需要设计一个算法来识别它们。必须验证圆弧是否共享同一中心点,是否在端点处连接,其内角是否为180度(DXF代码42设置为1.0-这也确保了圆弧的解析意义相同,因此不重合)。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 17:57:03 | 显示全部楼层
你可以通过Express Tools-overkill将甜甜圈变为圆形。
然后运行李的代码。
 
或者试试这个来代替甜甜圈:
  1. (defun c:cir2ins ( / blk ss )  
  2. ;; © Lee Mac 2010
  3. (if
  4.    (and
  5.      (setq blk
  6.        (LM:SelectifFoo
  7.          (lambda ( x )
  8.            (and (eq "INSERT" (cdr (assoc 0 (entget x))))
  9.              (zerop
  10.                (logand (+ 1 4)
  11.                  (cdr
  12.                    (assoc 70
  13.                      (tblsearch "BLOCK"
  14.                        (cdr
  15.                          (assoc 2
  16.                            (entget x)
  17.                          )
  18.                        )
  19.                      )
  20.                    )
  21.                  )
  22.                )
  23.              )
  24.            )
  25.          )
  26.          "\nSelect Block: "
  27.        )
  28.      )
  29.      (setq ss (ssget "_:L" '((0 . "CIRCLE"))))
  30.    )
  31.    (
  32.      (lambda ( i / e )
  33.        (while (setq e (ssname ss (setq i (1+ i))))
  34.          (if
  35.            (entmakex
  36.              (append
  37.                (list
  38.                  (cons 0 "INSERT")
  39.                  (assoc 2 (entget blk))
  40.                )
  41.                (LM:RemovePairs '(0 100 40) (entget e))
  42.              )
  43.            )
  44.            (entdel e)
  45.          )
  46.        )
  47.      )
  48.      -1
  49.    )
  50. )
  51. (princ)
  52. )
  53.    
  54. (defun LM:SelectifFoo ( foo str / sel ent )
  55. (vl-load-com)
  56. ;; © Lee Mac 2010
  57. (while
  58.    (progn
  59.      (setq sel (entsel str))
  60.      
  61.      (cond
  62.        (
  63.          (vl-consp sel)
  64.          (if (not (foo (setq ent (car sel))))
  65.            (princ "\n** Invalid Object Selected **")
  66.          )
  67.        )
  68.      )
  69.    )
  70. )
  71. ent
  72. )
  73.                  
  74. (defun LM:RemovePairs ( pairs lst )
  75. (vl-load-com)
  76. ;; © Lee Mac 2010
  77. (vl-remove-if
  78.    (function
  79.      (lambda ( pair )
  80.        (vl-position (car pair) pairs)
  81.      )
  82.    )
  83.    lst
  84. )
  85. )
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 17:59:22 | 显示全部楼层
非常感谢Stefan,太棒了!
 
干杯
史蒂夫
回复

使用道具 举报

0

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:06:01 | 显示全部楼层
不客气,史蒂夫。我很高兴你喜欢它。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 18:10:24 | 显示全部楼层
大家好,
 
我是这个论坛的新手。我一直在寻找一个lisp例程,该例程可以选择任何层上特定直径(不是范围或大于/小于场景)的所有圆,并用块引用替换它们,然后删除原始圆。李的代码工作得很好,但我想做一个批量选择和替换,而不是选择每个单独的圈被替换。一个计数器来显示被替换了多少个圆圈是有益的,但这不是必要的。有人能帮我吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 04:54 , Processed in 0.800446 second(s), 72 queries .

© 2020-2025 乐筑天下

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