dweafer 发表于 2022-7-5 20:27:37

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+计数))
)
)

Tharwat 发表于 2022-7-5 20:32:37

像这样的?
 

(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)
)

dweafer 发表于 2022-7-5 20:37:58

谢谢Tharwat,
 
这与我想要的很接近,但每次链测长度大于1000时,我需要“Ch 0+”旁边的“0”来增加,以便打印出来
 
“通道0+500”表示500
 
“通道1+200”用于1200
 
2300的“通道2+300”
 
谢谢你的帮助,这可以引导我得到它。

Tharwat 发表于 2022-7-5 20:40:59

我修改了上面的程序,尝试一下,然后告诉我。

dweafer 发表于 2022-7-5 20:42:22

谢谢Tharwat
 
去那里好的
 
这就是我想要的。我认为,在每次增加1000后,计数将需要重置为=0,因为通道1沿线路每100m链长计数。达到1000后
 
链测长度1000 its Ch 1+000
 
链测长度1100其Ch 2+1100(其中我要查找链测长度1100的“Ch 1+100”)
 
希望有办法做到这一点,否则我可能会要求太多:?
 
再次感谢。

Tharwat 发表于 2022-7-5 20:48:05

不够清楚,但请再次尝试修改。

hanhphuc 发表于 2022-7-5 20:51:52

嗨,塔瓦,我想是个有礼貌的人?试试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

dweafer 发表于 2022-7-5 20:54:42


 
理想情况下,它的工作原理类似于将白色文本从行中偏移。红色是原来的Lisp程序,绿色是你帮助我的。
 
如果我能得到这个,这将是一个很大的帮助,我的许多项目的工作

SLW210 发表于 2022-7-5 20:58:43

请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。

Tharwat 发表于 2022-7-5 21:00:46

 
嗨,韩,是的。。。你可能是对的,而我实际上是个机械人
 
 
@OP.如果这个数字大于2000,会怎样?它应该是什么样子?
页: [1] 2
查看完整版本: Lisp问题。对Lis来说非常陌生