suriwaits 发表于 2022-7-6 06:44:11

为块指定值

你好
 
我想有一个lisp计算流量的灌溉喷头在点击。
 
图形中有不同的块。我想将0.23分配给块1,0.12分配给块2,0.06分配给块3。
 
选择完块后,所需的lisp是按块1的数量x 0.23+块2的数量x 0.12+块3的数量x 0.06计算流量。
 
如果有人能用Autolisp写这篇文章,我将不胜感激。
 
谢谢,如果解释不清楚,请告诉我

Tharwat 发表于 2022-7-6 06:51:41

欢迎来到Cadtutor
 
这是否意味着您有块(非属性块)并且您想要计算选定块中的值?
 
如果没有,请更具体地说明你的日常目标。
 
塔瓦特

suriwaits 发表于 2022-7-6 06:54:01

感谢您的及时回复。
 
我有没有属性块。
 
我在下面的链接中有类似的线程
 
http://www.cadtutor.net/forum/showthread.php?54111-数据提取和突出显示=灌溉
 
我正在为没有属性的块寻找相同的属性。
 
再次感谢,
 
Suriwaits。

Tharwat 发表于 2022-7-6 06:58:07

您想在文本或警报消息中显示这些值吗?

suriwaits 发表于 2022-7-6 07:06:09

警报信息将非常好。。

Tharwat 发表于 2022-7-6 07:09:19

现在试试这个草稿。。。
 

(defun c:Test (/ *error* IfBlockhasSingleTextObject _sum j ss i sn l)
;;--- Tharwat 31. March, 2013 ---;;
(defun *error* (msg)
   (princ
   "\n*Cancelled by user or by coincidence ,Nothings more*"
   )
)
(defun IfBlockhasSingleTextObject (e / i)
   (setq i 0)
   (setq e (tblobjname "BLOCK" (cdr (assoc 2 (entget e)))))
   (while (and    (setq e (entnext e))
       (not (eq (cdr (assoc 0 (entget e))) "SEQEND"))
      )
   (if (wcmatch (cdr (assoc 0 (entget e))) "*TEXT")
   (setq i (1+ i))
   )
   )
   i
)
(defun _sum (en / sm)
   (setq sm 0.)
   (setq en (tblobjname "BLOCK" (cdr (assoc 2 (entget en)))))
   (while (and    (setq en (entnext en))
       (not (eq (cdr (assoc 0 (entget en))) "SEQEND"))
      )
   (if (and (wcmatch (cdr (assoc 0 (entget en))) "*TEXT")
          (numberp (read (cdr (assoc 1 (entget en)))))
   )
   (setq sm (+ (read (cdr (assoc 1 (entget en)))) sm))
   )
   )
   sm
)
(if (setq j0.
       ss (ssget "_:L" '((0 . "INSERT")))
   )
   (repeat (setq i (sslength ss))
   (setq sn (ssname ss (setq i (1- i))))
   (if (eq (IfBlockhasSingleTextObject sn) 1)
   (setq j (+ (_sum sn) j))
   (setq l (cons sn l))
   )
   )
)
(if l
   (alert
   (strcat "You have < "
         (itoa (length l))
         " > Blocks doesn't have or have more than one Text entity "
   )
   )
)
(if (> j 0)
   (alert (strcat "Total Values : " (rtos j 2 4)))
)
(princ "\nWritten by Tharwat Al Shoufi")
(princ)
)

suriwaits 发表于 2022-7-6 07:13:27

尊敬的Tharwat先生:
 
看起来Lisp程序很好。谢谢
早上到办公室时,我会试试你的Lisp程序。
 
看到你的Lisp程序和我给你的输入不足,这不会像我想的那样奏效,
 
因为我的块中没有任何文本值或属性
 
比如说,
对于块名为BLK1的块,其值应为0.23
类似地,对于BLk2-0.12和BLK3-0.06(该值不一定要在图纸中显示,它应该取该值并乘以相应块的数量,将其与其他块x值相加,并显示为流是“总和的值”
 
我将使用你的程序张贴在这里,如果它是不可能的,我想如何。。
 
Suriwaits公司

Tharwat 发表于 2022-7-6 07:19:12

如果您可以上传一个样例图形,那么就可以更清楚地了解代码的目标。

suriwaits 发表于 2022-7-6 07:23:00

尊敬的Tharwat先生:,
 
当块具有所需值的文本时,您的程序可以完美地工作。
 
在附图中,有3个不同的区块
下面是数量
15个180度
9个360度
2个90度
 
现在我想要程序来计算
 
15x0.12+9x0.23+2x0.06
 
0.12、0.23和0.06分别是180度、360度和90度灌溉喷嘴的流量。
喷雾器1-副本。图纸

Tharwat 发表于 2022-7-6 07:27:33

如果我能治好你。
 

(defun c:Test (/ *error* j ss i e)
;;--- Tharwat 31. March, 2013 ---;;
(defun *error* (msg)
   (princ
   "\n*Cancelled by user or by coincidence ,Nothings more*"
   )
)
(if (setq j0.
       ss (ssget "_:L" '((0 . "INSERT") (2 . "180DEG,360DEG,90DEG")))
   )
   (repeat (setq i (sslength ss))
   (setq e (entget (ssname ss (setq i (1- i)))))
   (cond ((eq (cdr (assoc 2 e)) "90DEG")
      (setq j (+ 0.12 j))
       )
       ((eq (cdr (assoc 2 e)) "180DEG")
      (setq j (+ 1.8 j))
       )
       (t
      (eq (cdr (assoc 2 e)) "360DEG")
      (setq j (+ 2.07 j))
       )
   )
   )
)
(if (> j 0)
   (alert (strcat "Total Values : " (rtos j 2 4)))
)
(princ)
)
页: [1] 2
查看完整版本: 为块指定值