Makkc 发表于 2022-7-5 16:11:47

Lisp获取pline的长度

尊敬的lisp advanced用户:,
请慷慨地帮助我实现以下操作的自动化
步骤1:用户选择多段线
步骤2:用户选择维度
步骤3:用户插入2个值:值1和值2
第4步:当4个不同的单独文本元素出现时,用户选择一个点:
值1;多边形长度;(尺寸测量值/值2)+1;5*线路长度*(值1)^2
 
文本的颜色应取决于值1,因此具有相同值1的文本应具有相同的颜色。
 
不幸的是,我没有在论坛上找到任何解决方案。这个lisp可能会有所帮助http://www.cadtutor.net/forum/showthread.php?36659-lisp将带有pline leangth的文本放在第2行/第2页上方。谢谢李。
提前非常感谢

Emmanuel Delay 发表于 2022-7-5 16:35:28

我不确定你的值1和颜色是什么意思。例如,您的意思是:如果value1=10=>文本为红色;值1=90=>绿色。。。?
 
 
值1是整数;value2是浮点吗?

Makkc 发表于 2022-7-5 16:44:51

 
尊敬的Emmanuel Delay,
是的,我的意思是,如果value1=10=>文本为红色;值1=90=>绿色;
值1只能是6-8-10-12-14-16-18-20-22-25-28-32-36-40,值2可以是任何数字。
此外,(dim测量)/值2+1应四舍五入到最接近的最大整数
提前谢谢你

Emmanuel Delay 发表于 2022-7-5 16:58:12

我想我明白了。请检查这是否是要求。
 
 
缺少任何功能?
 
我并没有做所有的检查,比如value1的可能值列表
 
命令为“P”,请随意更改此命令,以及代码顶部的设置
 
 
哦,是的,^2,这只是价值的动力吗?否则您需要更改(expt)的位置
 

;; http://www.cadtutor.net/forum/showthread.php?101221-Lisp-to-get-length-of-a-pline-and-dim-value-and-put-it-to-the-several-text-elements
;; step 1: User select the polyline
;; step 2: User select the dimension
;; step 3: User insert 2 values: value 1 and value 2
;; step 4: User pick a point were the 4 different separate text elements appears:
;;    value 1; polyine length; (dimension measurement value/value2)+1; 5*pline length*(value1)^2
;;    the color of the text should depend from value1, so the text with the same value1 should have the same color.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; @see https://www.theswamp.org/index.php?topic=32148.0
(defun Text (pt hgt str)
(entmakex (list (cons 0 "TEXT")
               (cons 10pt)
               (cons 40 hgt)
               (cons 1str))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; settings
(setq
text_height 10
text_spacing 14;; vertical distance between the lines
)
(defun c:p ( / ss_pline pline_length ss_dim dim_measurement entitylist value1 value2 pt text1 text2 text3 text4 val3)
(vl-load-com)
;; step 1: User select the polyline
(princ "\nSelect Polyline: ")
(setq ss_pline (ssget":S"(list (cons 0 "LWPOLYLINE")) ))
(setq pline_length (vla-get-length (vlax-ename->vla-object (ssname ss_pline 0))))
;; step 2: User select the dimension
(princ "\nSelect Dim: ")
(setq ss_dim (ssget":S" (list (cons 0 "DIMENSION")) ))   ;;   
(setq entitylist (cdr (entget (ssname ss_dim 0))))
(setq dim_measurement (cdr (assoc 42 entitylist) ))
;; step 3: User insert 2 values: value 1 and value 2
(setq
   value1 (getint "\nValue1 (int): ")
   value2 (getreal "\nValue2 (float): ")
)
;; step 4: User pick a point were the 4 different separate text elements appears:
(setq pt (getpoint "\nGet Point: "))

;; Make text
   ;; value 1
(setq text1 (Text pt text_height (itoa value1)))
   ;; polyine length
(setq text2 (Text (list (nth 0 pt) (- (nth 1 pt) text_spacing )) text_height (rtos pline_length)) )
   ;; (dimension measurement value/value2)+1
(setq val3 (fix (+ 0.5 (+ 1 (/ (float dim_measurement) value2))) ))
(setq text3 (Text (list (nth 0 pt) (- (nth 1 pt) (* 2 text_spacing) )) text_height (rtos val3)) )
   ;; 5*pline length*(value1)^2
(setq val4 (* (* 5 pline_length) (expt value1 2) ) )
(setq text4 (Text (list (nth 0 pt) (- (nth 1 pt) (* 3 text_spacing) )) text_height (rtos val4)) )
   
   ;; the color of the text should depend from value1
(vla-put-Color (vlax-ename->vla-object text1) value1)
(vla-put-Color (vlax-ename->vla-object text2) value1)
(vla-put-Color (vlax-ename->vla-object text3) value1)
(vla-put-Color (vlax-ename->vla-object text4) value1)

)

Makkc 发表于 2022-7-5 17:04:41

尊敬的Emmanuel Delay,
非常感谢你!你的技能和知识都很棒!
该程序运行良好。
我可以问你一些小更新吗
1、将文本元素排成一行
2、增加第5个元素:val4*val3
3.使程序记住val1和val2的最后值
再次感谢您的时间和努力,
格言

Emmanuel Delay 发表于 2022-7-5 17:18:04


 
 
我明天会试着做这件事。
不是问题。
 
 
3: 当客户端按下enter键时,将设置上一个值。
我有一个测试程序,显示了原理。顺便说一句,如果有人用更优雅的方式做这件事,请告诉我。
问题是我必须检查变量是字符串还是数字。。。这需要一些时间
 
 

;; global vars, these will remember the last chosen values
(setq
pickvalue1 0
pickvalue2 0
)
;;
(defun c:test ( / value1 value2 promprstring )
(setq promprstring (strcat
   "\nEnter Value 1 <" (rtos pickvalue1) ">: "
))
(setq value1 (getstring promprstring))
(if (= value1 "")
   (progn)
   (setq pickvalue1 (atof value1))
)

(setq promprstring (strcat
   "\nEnter Value 2 <" (rtos pickvalue2) ">: "
))
(setq value2 (getstring promprstring))
(if (= value2 "")
   (progn)
   (setq pickvalue2 (atof value2))
)
(princ "\n")
(princ pickvalue1)
(princ " - ")
(princ pickvalue2)
(princ)
)


 
 
1: 列的好处是:您不需要知道文本元素的长度(大小)。你是一排的。关于每个元素的字体大小和最大宽度有什么想法吗?
页: [1]
查看完整版本: Lisp获取pline的长度