ahyin 发表于 2022-7-6 09:16:12

重画多段线

(defun c:redrawpl ()
(setq sset (ssget "x" '(0 . "lwpolyline") (cons 67 (logand (1+ (getvar "TILEMODE"))1)) ))
   (setq ctr 0)
   (repeat (sslength sset)
    (setq item (ssname sset ctr))
      (vl-cmdf "_isolateobjects" item "")
       (setq ron (vlax-ename->vla-object item))
         (setq olayer (vla-get-layer ron))
         (command "-layer" "set" olayer "" )
         (setq p1 (pline-centroid item))
         (vl-cmdf "_.-boundary" "_A" "_O" "polyline" "_I" "_N" ""p1 "")
      (vl-cmdf "_unisolateobjects" "")
      (vla-delete ron)
         (command "_change" (entlast) "" "p" "la" "layer1" "")
      (setq ctr (1+ ctr))
   )
)
 
我正试图用上述方法重新绘制所有多段线。为了避免创建错误的多段线,我使用isolateobjects的功能来关闭其他对象。然后,它将基于保留的多段线创建新的多段线。但我发现当我使用这种方法应用于绘图时,里面有很多物体,速度很慢。此外,某些多段线无法使用此方法创建。还有其他好的方法来创建多段线吗?
 
非常感谢。

MSasu 发表于 2022-7-6 09:35:38

请看一下ENTMAKE函数作为替代解决方案。
 
或者,可以尝试禁用OSMODE系统变量,而不是隔离实体-不要忘记稍后恢复它。
 

(setq PrevOsnapMode (getvar "OSMODE"))   ;retain current state
(setvar "OSMODE" 0)                      ;disable auto OSNAP
; your procesing here
(setvar "OSMODE" PrevOsnapMode)          ;restore previous state

 
Regrads,
米尔恰

ahyin 发表于 2022-7-6 09:36:50

谢谢你的快速回复!你能教我怎么写这个测试条件吗。
 

(defun c:creg ()
(setq a (car (entsel)))
(command "region" a "")
;if convert to region is failed then explode it and then rejoin by pedit
(while
(setq ent (vlax-ename->vla-object a))
(vla-explode ent)
    (command "_.pedit" "_m"
(ssget "_p") "" "_y" "_j" 0.0 "")

   )
)

MSasu 发表于 2022-7-6 09:49:45

将图形中最后一个可用图元(尝试创建区域之前)与发出区域命令后的最后一个图元进行比较如何?如果向区域的转换成功,这些应该是不同的。
 

(setq LastItem (entlast))   ;retain last item in drawing

(setq a (car (entsel)))
(command "_REGION" a "")    ;attempt to create a region

(setq DrawItem (entlast))   ;list again last item in drawing

(if (not (equal LastItem DrawItem))   ;compare above entities
(prompt "\The region was created!")
(prompt "\The region wasn't created!")
)
 
当做
米尔恰

ahyin 发表于 2022-7-6 10:04:12

谢谢你Mircea,我正在尝试使用这种方法创建区域,但没有成功。
 
(defun c:creg ()

(setq a (car (entsel)))
(setq lastitem (entlast ))
(command "region" a "")
(setq drawitem (entlast))
(if (not (equal lastitem drawitem))
(prompt "The region was created")
(progn
(setq ent (vlax-ename->vla-object a))
    (vla-explode ent)
   (command "_.pedit" "_m"
(ssget "_p") "" "_y" "_j" 0.0 "")
)
(command "region" (entlast))
   )
)

MSasu 发表于 2022-7-6 10:13:43

尝试通过ENTNEXT解析新创建的实体(来自爆炸命令),该实体从爆炸前绘制的最后一个实体开始;使用SSADD创建新的选择集。
 
当做
米尔恰

ahyin 发表于 2022-7-6 10:16:20

再次感谢!我会按照这个方向完成这个项目。
页: [1]
查看完整版本: 重画多段线