BrianTFC 发表于 2022-7-5 20:11:34

如何将文本居中放置在

大家好,
 
我在弄清楚如何在创建文本后将其居中放置在矩形的中间时遇到了一些问题。这是我到目前为止所拥有的,它可以工作,但它等待我放置它。我还做了很多大小相同的面板,所以我也想让lisp记住最后一个输入,这样我就可以继续使用它,直到我点击escape或return。
如果我能得到一些帮助,我将不胜感激。
 
(defun C:CRP7()
(setq cmdold (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq PL (getstring "Enter a Panel Label :"))
(setq PA (getpoint "Select Panel Area :"))
(command "-boundary" "Advanced" "Island" "No" "Nearest" "" pa "")
(command "_.change" (entlast) "" "_p" "_la" "Router - Green - V groove" "")

(setq ts(getvar "textsize"))
(setq tsty(getvar "textstyle"))

(if(= 0 (cdr(assoc 40(tblsearch "style" tsty))))
       (progn
   
(command "text" "Justify" "Center" pa ts 0 PL)))
(setvar "cmdecho" cmdold)
   
(princ)
)
 
谢谢Brian

hmsilva 发表于 2022-7-5 20:17:57

嗨,布莱恩,
 
如果未使用AutoCAD 2015,请尝试以下程序。
“bpoly”函数在AC2015中产生错误(不确定原因)。。。
将默认提示“123”更改为面板大小。

(vl-load-com)
(defun c:demo ( / adoc bp cen lays msp pa pl plo reg sfa txt)
(setq adoc (vla-get-activedocument (vlax-get-acad-object))
       msp (vla-get-modelspace adoc)
       lays (vla-get-layers adoc)
   )
(vla-add lays "Router - Green - V groove")
(while (and (setq pa (getpoint "\n Select Panel Area: "))
             (setq pl (getstring (strcat "\nEnter a Panel Label <" (cond (*pl) ("123")) ">: "))
                   *pl (cond ((/= pl "") (strcase pl)) (*pl) ("123"))
                   )
             (setq bp (bpoly pa))
             )
   (setq plo (vlax-ename->vla-object bp)
         sfa (vlax-make-safearray vlax-vbObject '(0 . 0))
   )
   (vla-put-layer plo "Router - Green - V groove")
   (vlax-safearray-put-element sfa 0 plo)
   (setq reg (car (vlax-safearray->list (vlax-variant-value (vla-addregion msp sfa))))
         cen (vlax-get reg 'centroid)
         )
   (vla-delete reg)
   (setq txt (vla-AddText msp *pl (vlax-3D-point (trans cen 1 0)) (getvar 'TEXTSIZE)))
   (vla-put-alignment txt 10)
   (vla-put-textalignmentpoint txt (vlax-3D-point (trans cen 1 0)))
   (vla-put-rotation txt (angle (list 0 0)(getvar 'UCSXDIR)))
   )
(princ)
)

希望有帮助
亨里克

BIGAL 发表于 2022-7-5 20:20:59

也许是另一种方法,如果你输入bpoly,然后得到坐标,那么第一个和第三个的中间是中心点。
 

(defun getcoords (ent)
(vlax-safearray->list
   (vlax-variant-value
   (vlax-get-property
   (vlax-ename->vla-object ent)
   "Coordinates"
   )
   )
)
)

(defun co-ords2xy ()
; convert now to a list of xy as co-ords are x y x y x y if 3d x y z x y z
(setq numb (/ (length co-ords) 2))
(setq I 0)
(repeat numb
(setq xy (list (nth (+ I 1) co-ords)(nth I co-ords) ))
(setq coordsxy (cons xy coordsxy))
(setq I (+ I 2))
) ; end repeat
)

(setq co-ords (getcoords (entlast)))

Tharwat 发表于 2022-7-5 20:24:09

@亨里克
 
你不觉得最好将函数移到一个单独的子函数中,以获得Activedocument、ModelSpace、Layers集合,然后从while函数的循环中添加一个新层吗?
 
当做

BIGAL 发表于 2022-7-5 20:27:19

像Tharwat一样,你会在我的代码2 defuns中看到,因为我的库lisp中有1个用于我一直使用的std内容。我关于civ3d标签的帖子只在新代码中打开Aec数据库defun。输入相同的Getval nice dcl。到了这个阶段,我需要完成所有的代码和标准化。

hmsilva 发表于 2022-7-5 20:30:26

嗨,塔瓦,
 
你当然是对的!
 
#3处的代码是用一个“if”函数编写的,发布时,我看到OP希望代码在一个循环中,我将其(快速且脏)修改为“while”。。。
 
我的主要目标是,尝试演示另一种方法,最重要的是,尝试传递这样的想法,即在将数据提交给另一个函数/命令之前,我们应该验证函数返回的数据。
 
修订了消息#3中的代码。
 
干杯
亨里克

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

 
毫无疑问,这很好

yathishkumar 发表于 2022-7-5 20:35:43

你好
 
请查找随附的lisp。
 
这是李的来信。
工作很好
 
谢谢
yathishkumar先生
文本居中。lsp

hmsilva 发表于 2022-7-5 20:39:51

谢谢Tharwat!

BrianTFC 发表于 2022-7-5 20:42:29

亨里克,
 
我正在使用AutoCAD 2015,我只是没有机会在这里更新我的信息。那么我们如何解决这个问题呢?
 
谢谢
布瑞恩
页: [1] 2
查看完整版本: 如何将文本居中放置在