打破了很多界线
嗨,我的新项目是由一个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命令听我的之前,我真的无法取得进展。
银色斗篷 (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
)
您可以在循环中或生成列表后调用中断。
试试,告诉我你的想法
编辑:修改代码。。无论如何,使用这种方法,您不需要创建临时层
知道了?
我在那里完全迷路了。。。
谢谢pBe!!我来看看能做些什么谢谢你教我钓鱼
也许我们会在您“钓鱼”后重新讨论子功能讨论。。。在那之前,我最重要的建议是让你正确地定位你的变量。
熟悉DEFUN函数,以便更好地理解LISP函数的结构,特别是符号、参数和变量之间的差异以及表达式本身。
简而言之,通过不本地化变量,当代码完成时,您定义的变量将保留其赋值
要验证这一点,只需在命令行中键入惊叹号“!”然后是您要检查的变量名称,如果变量有任何值,它将显示在命令行中:
例子:
(defun _break (e1 e2 coord)
;; <-- Do something
)
非局部变量可能导致对同一函数的后续调用中出现意外行为,甚至是使用相同变量的其他函数。将变量本地化被认为是一种最佳做法。
通过在主命令代码中“嵌套”子函数,可以正确地本地化变量,并将这些变量提供给子函数,而无需将它们(定义的变量)暴露给其他函数。
这与方法类似(不完全相同)。NET使用名称空间,其中(一般来说)只有在给定名称空间中定义的类和方法可以交互。
希望这些对你有意义。。。我相信,一旦你开始为自己“钓鱼”,这将对你有用。
HTH公司 这条线索可能很有趣:http://www.theswamp.org/index.php?topic=39550.msg448171#msg448171
*必须是会员* 艾伦,这很好,干得好! 谢谢-把啤酒换成咖啡。
我已经发布了几个曲线打破例程在整个线程。
不。。。那只是泡沫卡布奇诺。英雄联盟
我得去看看。 很好。
页:
[1]
2