Lisp问题。对Lis来说非常陌生
你好我在网上找到了这个,它很管用。但是输出与工程师/客户所寻找的不同。
链测长度打印在“100”、“200”-->“1100”、“1200”等处。
我正在寻找链测长度来打印“ch 0+100”,“ch 0+200”-->“ch 1+100”,“ch 1+200”
任何帮助都会很好,甚至可以为我指明如何做到这一点的方向。我已经附上了Lisp的工作在这里。
(defun c:CHAINTXT(/)(chaineage\u text))
(defun chaineage_text(/)
(vl load com)
(setq ss(ssget)
计数0
距离100.0
偏移量5
高度2.5
)
(重复(sslength ss)
(setq ent(ssname ss count)
obj(vlax ename->vla object ent)
链测距离
)
(同时)
(setq点1(vlax曲线getPointAtDist obj链测长度))
(setq点2(vlax曲线getPointAtDist obj(+链测长度0.1)))
)
(setq轴承(+(角度点1点2)(/PI 2.0)))
(entmake(附加
((0.LINE)(100.AcDbEntity)(67.0)(410.Model)(8.0)(100.AcDbLine))
(列表(cons 10(极点1方位偏移))
(列表(cons 11(极点1(+方位PI)偏移))
'((210 0.0 0.0 1.0))
)
)
(entmake(附加
“((0。“TEXT”)(100。“AcDbEntity”)(67.0)(410。“Model”)(8.0”)(100。“AcDbText”))
(列表(cons 10(极点1(+轴承PI)(*偏移2.0)))
(列表(cons 40高度))
(列表(cons 1(rtos链测长度2-3)))
(列表(cons 50(+轴承PI)))
“((41.1.0)(51.0.0)(7。“标准”)(71.0)(72.0)(11 0.0 0.0.0)(210 0.0 0.0 1.0)(100。“AcDbText”)(73.0))
)
)
(setq链测长度(+链测距离))
)
(setq计数(1+计数))
)
) 像这样的?
(defun c:Test (/ bearing chainage dist ent height obj offset point1
point2 ss i n
)
;; Tharwat 17.12.2014 ;;
(setq dist 100.0
offset 5
height 2.5
)
(if (setq ss (ssget '((0 . "LWPOLYLINE,SPLINE"))))
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i)))
obj (vlax-ename->vla-object ent)
chainage dist
n 0
)
(while
(and
(setq point1 (vlax-curve-getPointAtDist obj chainage))
(setq point2 (vlax-curve-getPointAtDist obj (+ chainage 0.1)))
)
(setq bearing (+ (angle point1 point2) (/ pi 2.0)))
(entmake
(list '(0 . "LINE")
'(8 . "0")
(cons 10 (polar point1 bearing offset))
(cons 11 (polar point1 (+ bearing pi) offset))
'(210 0.0 0.0 1.0)
)
)
(entmake
(list '(0 . "TEXT")
'(8 . "0")
(cons 10 (polar point1 (+ bearing pi) (* offset 2.0)))
(cons 40 height)
(cons 1
(strcat "'ch "
(if (> chainage 1000.)
(itoa (setq n (1+ n)))
"0"
)
"+"
(rtos chainage 2 3)
)
)
(cons 50 (+ bearing pi))
'(41 . 1.0)
'(51 . 0.0)
'(7 . "Standard")
'(71 . 0)
'(72 . 0)
'(11 0.0 0.0 0.0)
'(210 0.0 0.0 1.0)
'(73 . 0)
)
)
(setq chainage (+ chainage dist)
)
)
)
)
(princ)
)
谢谢Tharwat,
这与我想要的很接近,但每次链测长度大于1000时,我需要“Ch 0+”旁边的“0”来增加,以便打印出来
“通道0+500”表示500
“通道1+200”用于1200
2300的“通道2+300”
谢谢你的帮助,这可以引导我得到它。 我修改了上面的程序,尝试一下,然后告诉我。 谢谢Tharwat
去那里好的
这就是我想要的。我认为,在每次增加1000后,计数将需要重置为=0,因为通道1沿线路每100m链长计数。达到1000后
链测长度1000 its Ch 1+000
链测长度1100其Ch 2+1100(其中我要查找链测长度1100的“Ch 1+100”)
希望有办法做到这一点,否则我可能会要求太多:?
再次感谢。 不够清楚,但请再次尝试修改。 嗨,塔瓦,我想是个有礼貌的人?试试ymg的格式化功能。我也借它来做我的电台标签程序
;;http://www.theswamp.org/index.php?topic=45311.0
;; rtosta by ymgSeptember 2013 ;
;; ;
;; Arguments: sta Real number to format as a Station ;
;; unit 1 for Imperials, ;
;; 2 for Metrics. ;
;; prec Integer for number of decimals ;
;; ;
;; Examples: (rtosta 0 1 0)-> "0+00" (rtosta 1328.325 1 2) -> "13+28.33";
;; (rtosta 0 2 0)-> "0+000"(rtosta 1328.325 2 2) -> "1+328.33";
;; ;
;; If sta is negative, format is as follow: ;
;; (rtosta -1328.325 1 2) -> "13-28.33" ;
;; (rtosta -1328.325 2 2) -> "1-328.33" ;
;; ;
(defun rtosta (sta unit prec / str a b dz)
(setq dz (getvar 'dimzin))
(setvar 'dimzin 0)
(setq str (rtos (abs sta) 2 prec))
(setvar 'dimzin dz)
(while (< (strlen str)
(if (= prec 0)
(+ unit 2)
(+ prec (+ unit 3))
) ;_ end of if
) ;_ end of <
(setq str (strcat "0" str))
) ;_ end of while
(setq a (if (= prec 0)
(- (strlen str) unit)
(- (strlen str) prec (+ unit 1))
) ;_ end of if
b (substr str 1 (- a 1))
a (substr str a)
) ;_ end of setq
(strcat b
(if (minusp sta)
"-"
"+"
) ;_ end of if
a
) ;_ end of strcat
) ;_ end of defun
理想情况下,它的工作原理类似于将白色文本从行中偏移。红色是原来的Lisp程序,绿色是你帮助我的。
如果我能得到这个,这将是一个很大的帮助,我的许多项目的工作 请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。
嗨,韩,是的。。。你可能是对的,而我实际上是个机械人
@OP.如果这个数字大于2000,会怎样?它应该是什么样子?
页:
[1]
2