Silvercloak 发表于 2022-7-6 08:05:40

打破了很多界线

嗨,我的新项目是由一个civ3d的家伙给我的。他想把一堆线或柱脚,有时是等高线,打断一段固定的距离。我花了几天时间思考该如何处理。以下是我的解决方案;然而,我有一个小问题。
 
我似乎无法使用我的选择集实体让break命令做出响应。有人知道我怎么解决这个问题吗?
 
;;;March 31, 2012
;;;This program will allow the user to select multiple lines and plines
;;;then it will temporarily move each line and pline to a temporary layer then layer isolate to THAT layer
;;;place points along each line and pline at a given distance by the user
;;;break each line at each point, return all lines and plines to their original layer
;;;and then unisolate and return to the current layer
(defun layerchg        ()
(command "-layer" "m" lyname "")
(setq n (sslength SS1))
(repeat n
   (setq ENT (ssname SS1 (- N 1)))
   (setq ENTLIST (entget ENT))
   (setq ENTLIST (subst (cons 8 LYNAME) (assoc 8 ENTLIST) ENTLIST))
   (entmod ENTLIST)
   (setq n (- n 1))
)
)
(defun breakpt ()
(command "layiso" SS1 "")
(setvar "Clayer" Lyname)
(repeat (setq n (sslength ss1))
   (setq ENT (ssname SS1 (- N 1)))
   (command "measure" ENT MSMT "")
   (setq SSpt (ssget "X" '((0 . "Point"))))
   (repeat (setq nx (sslength SSpt))
   (setq SSPTS (ssname SSpt (- N 1)))
   (setq ptent (entget SSPTS))
   (setq ptloc (cdr(assoc 10 ptent)))
   (command "break" ent "f" ptloc ptloc)
   (setq n (- n 1))
   )                                        ;End breaking repeat
   (command "erase" SSPT)
)                                        ;End repeat
)
(defun c:Linchg        ()
(setq CurLay (getvar "clayer"))
(setq Osnmde (getvar "osmode"))
(setq Cmd-Echo (getvar "cmdecho"))
(prompt
   "\nSelect all lines and/or plines you wish to change: "
)
(setq SS1 (ssget '((0 . "LINE,LWPOLYLINE"))))
(setq
   Msmt (getreal "Please enter the distance between break points.")
)
(setq LYNAME "Temporary")
(layerchg)
(breakpt)

)


 
请注意,这还没有结束或清理。这仍然是一项正在进行的工作,但在我想出如何让这个break命令听我的之前,我真的无法取得进展。
 
银色斗篷

pBe 发表于 2022-7-6 08:13:10

(defun breakpt ()
(command "layiso" SS1 "")
(setvar "Clayer" Lyname)
(repeat (setq n (sslength ss1))
   (setq ENT (ssname SS1 (- N 1)))
   (command "measure" ENT MSMT);;;<-remove ""
   (setq SSpt (ssget "X" '((0 . "Point"))))
   (repeat (setq nx (sslength SSpt))
   (setq SSPTS (ssname SSpt (- nx 1)))
   (setq ptent (entget SSPTS))
   (setq ptloc (cdr(assoc 10 ptent)))
   (command "break" ent "_non" ptloc "_non" ptloc);;;<-remove "f"
   (entdel SSPTS);;<-- delete point entity as you go   
    (setq ent (entlast))   
   (setq nx (- nx 1))
   )   ;End breaking repeat
;;;(command "erase" SSPT "");; commented
   (setq n (- n 1))   
)   ;End repeat
)

 
您可以在循环中或生成列表后调用中断。
 
试试,告诉我你的想法
 
编辑:修改代码。。无论如何,使用这种方法,您不需要创建临时层
知道了?

Silvercloak 发表于 2022-7-6 08:18:15

 
我在那里完全迷路了。。。

BlackBox 发表于 2022-7-6 08:22:02

 
谢谢pBe!!我来看看能做些什么谢谢你教我钓鱼

Silvercloak 发表于 2022-7-6 08:26:37

 
也许我们会在您“钓鱼”后重新讨论子功能讨论。。。在那之前,我最重要的建议是让你正确地定位你的变量。
 
熟悉DEFUN函数,以便更好地理解LISP函数的结构,特别是符号、参数和变量之间的差异以及表达式本身。
 
 
简而言之,通过不本地化变量,当代码完成时,您定义的变量将保留其赋值
 
要验证这一点,只需在命令行中键入惊叹号“!”然后是您要检查的变量名称,如果变量有任何值,它将显示在命令行中:
 
例子:
 

(defun _break (e1 e2 coord)
;; <-- Do something
)
非局部变量可能导致对同一函数的后续调用中出现意外行为,甚至是使用相同变量的其他函数。将变量本地化被认为是一种最佳做法。
 
通过在主命令代码中“嵌套”子函数,可以正确地本地化变量,并将这些变量提供给子函数,而无需将它们(定义的变量)暴露给其他函数。
 
这与方法类似(不完全相同)。NET使用名称空间,其中(一般来说)只有在给定名称空间中定义的类和方法可以交互。
 
希望这些对你有意义。。。我相信,一旦你开始为自己“钓鱼”,这将对你有用。
 
HTH公司

pBe 发表于 2022-7-6 08:31:18

这条线索可能很有趣:http://www.theswamp.org/index.php?topic=39550.msg448171#msg448171
 
*必须是会员*

Silvercloak 发表于 2022-7-6 08:34:50

艾伦,这很好,干得好!

Silvercloak 发表于 2022-7-6 08:39:46

谢谢-把啤酒换成咖啡。
我已经发布了几个曲线打破例程在整个线程。

BlackBox 发表于 2022-7-6 08:45:09

 
不。。。那只是泡沫卡布奇诺。英雄联盟
 
 
我得去看看。

alanjt 发表于 2022-7-6 08:50:54

很好。
页: [1] 2
查看完整版本: 打破了很多界线