ziofel 发表于 2022-7-6 10:42:30

将文本放置在直线或柱脚上

大家好,我需要在Visual Lisp中编写一个函数,将文本放置在一行或多行上。
文本在大小或长度上与所选行相对(这不是强制性的,但很好)
 
我知道这里有很多函数,可以将文本与不同角度的曲线或直线对齐,但我只需要一个简单的函数,并与任何长度的基本水平线对齐。
 
基本上就是这样。
 
此处为文本
 
用户选择行,然后用户键入文本,然后将文本放置在行上。
 
谢谢
拉夫

alanjt 发表于 2022-7-6 10:53:55

你已经开始做这件事了,还是只是在找施舍?

Tharwat 发表于 2022-7-6 11:00:27

 
您是否尝试过多行文字中的下划线按钮或文字命令中的%%u?
 
这会很有帮助。
 
塔瓦特

ziofel 发表于 2022-7-6 11:16:10

 
是的,我已经开始,也许应该把文件放在我有它。
 
 
(defun c:textline(/insertpoint textinput)
(setq insertpoint(getpoint“\n选择文本位置:”);等待用户输入
(命令“text”插入点2 0(strcat(princ textinput)))
(普林斯)
)
 
 
不,我想选择一行,文本放在上面。上面的工作,但需要调整文字略高于行和文字是相对于行的大小。另一个问题是,它需要一个点来插入文本,我想选择行并将文本放置在行上。

lpseifert 发表于 2022-7-6 11:21:34

如果你愿意,可以把它拆开

;;;Label storm pipe sizeLPS 2010-02-04   

(defun c:lblstsize (/ ent midpt entname obj mid-param beg-pt end-pt ang ins-pt)
(vl-load-com)

(setq temperr *error*            
       *error* errortrap
       varlst '("cmdecho")
       oldvar (mapcar 'getvar varlst)
   )

(setvar "cmdecho" 0)
(defun dtr (a) (* pi (/ a 180.0)))
(command "UCS" "W")
(setq ent (entsel "\nSelect pipe: ")
   midpt (osnap (cadr ent) "mid")
       entname (car ent)
   obj (vlax-ename->vla-object entname)
   mid-param (vlax-curve-getParamAtPoint obj midpt)
   beg-pt (vlax-curve-getPointAtParam obj (fix mid-param))
   end-pt (vlax-curve-getPointAtParamobj (1+ (fix mid-param)))
   ang (angle beg-pt end-pt))
   (if
   (and (> ang 1.74533) (< ang 4.53786))
   (setq ang (angle end-pt beg-pt))
          )
   
   (setq ins-pt (polar midpt (+ ang (/ pi 2)) (* (getvar "dimscale")0.125)))

   (if (not (tblsearch "layer" "st-txt"))
   (command "-layer" "m" "ST-TXT" "C" "130" "ST-TXT" ""))
(entmakex
   (list
   (cons 0   "MTEXT")         
   (cons 100 "AcDbEntity")         
   (cons 100 "AcDbMText")
   (cons 8 "ST-TXT")
   (cons 10 ins-pt)      
   (cons 1 (getstring T "\nEnter Pipe size: "))
   (cons 71 5)
   (cons 50 ang)
   (cons 7 "Simplex")
   (cons 40 (* (getvar "dimscale") 0.1))
   )
   )

(setvar "cmdecho" 1)
(command "UCS" "P")
(princ)
   );defun

(defun errortrap (msg)
(if oldvar (mapcar 'setvar varlst oldvar))
   (setq *error* temperr)
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n<< Error: " msg " >>"))
   )
(princ)
)

ziofel 发表于 2022-7-6 11:28:34

列表中的缺点是什么?
 
我对Lisp了解不多。

Lee Mac 发表于 2022-7-6 11:37:32

创建点对。
 
阅读关于cons的VLIDE中的Dev帮助。

fixo 发表于 2022-7-6 11:46:04

也试试这个
;;实验室lsp;;标记线/多段线(vl load com)(defun C:LAB(/acsp ang deriv dist dist1 dist2 ent mpt obj para pickpt txt txtpt)(setq acsp(vla get block(vla get activelayout(vla get activedocument(vlax get acad object)))(而(setq ent(entsel“\n选择线/pline:”)(setq obj(vlax ename->vla object(car ent))pickpt(vlax curve getclosestpointto obj(cadr ent))para(vlax curve getparamatpoint obj pickpt)mpt(vlax curve getpointatparam obj(+0.5(fix para)))txtpt(vlax-3d-point mpt)deriv(vlax curve getfirstderiv obj(vlax curve getparamatpoint obj pickpt))(if(zerop(cadr deriv))(setq ang 0)(setq ang((/pi 2)(atan(/(car deriv)(cadr deriv)))))(if(eq“AcDbLine”(vla get objectname obj))(setq dist(vla get length obj)(progn(setq dist1(vlax curve getdistatparam obj(fix para))dist2(vlax curve getdistatparam obj(1+(fix para)))dist(abs(-dist2 dist1 k)а))(setq txt(vla addtext acsp(rtos dist 3 2)txtpt 15.0));
页: [1]
查看完整版本: 将文本放置在直线或柱脚上