DaDinkles 发表于 2022-7-5 18:39:06

标注到多行文字块中

大家好,这里有谁知道一个lisp文件可以采用2个线性尺寸并将其输出到多行文字(或块)中。我基本上需要的是一个lisp,在这里我可以选择一个水平线性维度,然后是一个垂直维度,并将这些维度值插入到多行文字中。或者,它们可以是块属性,只要有效。我还需要文本的序列号,但我认为我有一个解决方案。
 
成品需要的是
 
文本[#]
更多文本[其他#]
[维度]
 
 
过去有人见过类似的Lisp程序吗?或者,如果没有,谁能为我指出一个可能的工作方向?
 
谢谢

Tharwat 发表于 2022-7-5 18:55:37

这应该很简单。
 
你能举一个结果的例子吗?

DaDinkles 发表于 2022-7-5 19:11:29

 
因此,我要做的是标记一条封闭的多段线(虽然这里可以选择分解),并将其最长的长度和宽度标注放在多行文字的末尾,但有时我需要在开始处设置水平标注,有时需要垂直标注。理想情况下,我希望将其全部放在一个块中,以便将其附加到一个引线。我想我找到了一个lisp来完成顺序编号部分,但到目前为止,尺寸部分一直困扰着我。我做了一个快速的图片,希望能说明这一点。
 
http://i.imgur.com/2eE9iZ2.png
 
我希望能够点击两行,得到一个维度,然后再点击两个维度,得到第二个维度,并将其放置在多行文字(或块)的底部。在这种情况下,我会先单击两条红线,然后单击两条蓝线。然后,我想我将为我之前找到的项目、零件和顺序块lisp添加属性。你可能知道我对这种更复杂的autocad有点陌生。谢谢你的帮助!

Tharwat 发表于 2022-7-5 19:18:52

像这样的?
 

(defun c:test (/ s lst e ss l)
;; Tharwat 08.09.2015    ;;
(princ "\nSelect the 1st group of lines :")
(if (and (setq s (ssget '((0 . "LINE"))))
          (princ "\nSelect the 2nd group of lines :")
          (setq ss (ssget '((0 . "LINE"))))
   )
   (progn

   (mapcar '(lambda (sel i / sn)
                (setq l 0.)
                (while (setq sn (ssname sel (setq i (1+ i))))
                  (setq l (+ l
                           (distance (cdr (assoc 10 (entget sn)))
                                       (cdr (assoc 11 (entget sn)))
                           )
                        )
                  )
                )
                (setq lst (cons l lst))
            )
             (list s ss)
             '(-1 -1)
   )
   )
)
(if (and lst
          (setq ss
               (nentsel "\nPick on Text, Mtext or Attribute in Block :")
          )
          (wcmatch (cdr (assoc 0 (entget (car ss))))
                   "TEXT,MTEXT,ATTRIB"
          )
   )
   (vla-put-textstring
   (setq v (vlax-ename->vla-object (car ss)))
   (strcat (vla-get-textstring v)
             " "
             (vl-princ-to-string (car lst))
             "x"
             (vl-princ-to-string (cadr lst))
   )
   )
)
(princ)
)(vl-load-com)

DaDinkles 发表于 2022-7-5 19:37:49

 
这不是我的意思,对不起,如果我不清楚的话。我的意思是我需要得到两条红线之间的距离作为一个维度,然后两条蓝线之间的距离作为另一个维度。虽然如果这不可能,我可以用一种改进的方式使用这个。
 
 
此外,出于某种原因,当我使用它时,它默认为十进制单位,而不是我设置的架构。你知道它是否可以改变吗?或者,如果这是一个有点多,谁能告诉我在正确的方向,聘请别人来完成这个Lisp程序?我不确定哪里是做这种专业的东西的好地方。

BIGAL 发表于 2022-7-5 19:49:48

只要在Cadtutor这里停留一下,经常会发布代码,但作为第一篇文章,这些代码的方向并不正确。塔瓦特的回复很好,我相信他会再次尝试。
 
下面是单个对象选项(如pline)的部分代码。对于多个对象,您需要不同的版本。我将扩展下面比较对象的示例。
 
(defun c:plXY ( / obj maxpoint minpoint LL UR)
(setq obj (vlax-ename->vla-object (car (entsel))))
(vla-GetBoundingBox obj 'minpoint 'maxpoint)
(setq LL (vlax-safearray->listminpoint))
(setq UR (vlax-safearray->listmaxpoint))
(setq x (- (car UR)(car LL)))
(setq y (- (cadr UR)(cadr LL)))
(Alert (strcat "Length is " (rtos x 2 3) " Width is " (rtos y 2 3)))
)
页: [1]
查看完整版本: 标注到多行文字块中