需要文字放置方面的帮助
我试着把层名放在线的中间(而不是中点)。还有,我怎样才能得到所选线条的角度,这样我就可以把文字平行于所选线条。谢谢(defun mip-text-entmake (txt pnt height rotation justification / ent_list)
;;; borrowed from ShaggyDoc
;;; http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=23&TID=30276
(setqent_list (list'(0 . "TEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(list 10 (car pnt) (cadr pnt) 0.0)
(cons 1 txt)
(cons 40 height)
(cons 7 (getvar "TEXTSTYLE"))
(if justification
(cond
((= justification "C")
'(72 . 1)
)
((= justification "R")
'(72 . 2)
)
((= justification "A")
'(72 . 3)
)
((= justification "M")
'(72 . 4)
)
((= justification "F")
'(72 . 5)
)
(t
'(72 . 0)
)
) ;_ end of cond
'(72 . 0)
) ;_ end of if
(cons 50 rotation)
(list 11 (car pnt) (cadr pnt) 0.0)
) ;_ end of list
) ;_ end of setq
(setq ent_list (entmakex ent_list))
)
(defun C:TEST (/ selobj #line)
(setq selobj (entsel))
(setq #line (cdr (assoc 8 (entget (car selobj)))))
(and
(setq pt (getpoint "\nPick center text point: "))
(setq pt (trans pt 1 0))
(mip-text-entmake
#line ;;; text
pt ;;; point
(getvar "TEXTSIZE") ;;; heigth
0 ;;; rotation
"C" ;;; justification
)
)
)
Assoc 10是起点,11是终点(角度起点-终点)这仅适用于直线,然后(/(距离起点-终点)2.0)这是中点距离,使用(极轴起点-角度距离)是直线上的中点。建议您可以添加一点额外的代码,比较您选择的端点,然后交换开始和结束,使文本正确的一面朝上。面朝下,从右侧。喜欢你的图像或添加旋转选项“is text ok”N旋转180。使用enter作为“Y”,否则其他所有内容都是否定的。
重要的是,角度总是以弧度表示,不使用“单位”等。 保持代码与现有代码相似,程序可以是这样的:
然而,上述方法仅适用于平行于WCS平面的UCS平面,也不能确保指定点位于选定线上。
如果您不想为文本指定点,则可以如下所示:
(defun c:test2 ( / ang entity norm point ) (vl-load-com)
(if
(and (setq entity (entsel))
(not
(vl-catch-all-error-p
(setq point
(vl-catch-all-apply 'vlax-curve-getclosestpointto
(list (car entity) (trans (cadr entity) 1 0))
)
)
)
)
)
(progn
(setq entity (car entity)
norm (trans '(0. 0. 1.) 1 0 t)
)
(setq ang
(angle '(0. 0. 0.)
(trans
(vlax-curve-getfirstderiv entity
(vlax-curve-getparamatpoint entity point)
)
0 norm
)
)
)
(if (and (< (/ pi 2.) ang) (<= ang (/ (* 3. pi) 2.)))
(setq ang (- ang pi))
)
(setq point (trans point 0 norm))
(entmakex
(list
(cons 0 "TEXT")
(cons 7(getvar 'TEXTSTYLE))
(cons 40 (getvar 'TEXTSIZE))
(cons 10 point)
(cons 11 point)
(cons 1 (cdr (assoc 8 (entget entity))))
(cons 50 ang)
(cons 72 1)
(cons 73 2)
(cons 210 norm)
)
)
)
)
(princ)
)
(defun C:test (/ p1 p2 angline)
(setq selobj (entget (entsel)))
(setq p1 (car (cdr (assoc 10 selobj))))
(setq p2 (car (cdr (assoc 11 selobj))))
(princ (angle p1 p2))
(princ)
)
这
4
谢谢LISP2LEARN,不客气
和往常一样,如果你对我发布的任何代码有任何问题,只要问我,我很乐意解释
有很多原因。
LISP是为列表操作而设计的,并提供了许多函数。这意味着许多任务使用DXF数据列表要简洁得多,而且,您不需要使用变体和安全数组。
DXF结构允许您通过对ent*函数的单个调用来修改实体的任何或所有属性,而无需单独挖掘每个属性。此外,我发现使用Vanilla AutoLISP使程序在所有UCS平面中兼容要容易得多。
Vanilla AutoLISP函数(如entmake)通常比Visual LISP等效函数快得多。
除此之外,丰富的普通方法使您能够在不访问Visual LISP的情况下为系统编写程序。
李 我很欣赏lisp在以下方面提供的灵活性,但我忍不住认为具有恒定列表长度的硬编码(entmake)是一种有点浪费的实现。
也就是说,我同意不必使用安全阵列变体绝对是方便的
根据Autodesk的说法,vlisp功能比普通功能更及时。
我完全同意这两方面的熟练程度(考虑到其他程序(如powercad)实现了这一点,更为普通)很重要;我想这只是我的偏好,离开香草方法的特殊场合笑。
为反馈喝彩。
我不理解你说的“浪费”的话——你能详细解释一下吗?
浪费不是最好的选择。主要是易读性;不是每个人第一眼就知道dxf组40和50是什么,但任何人都可以分别读取vla put textHeight和vla put rotation,或任何其他性质。
此外,我应该花点时间承认,虽然vlisp本质上比vanilla快,但entmake的情况并非如此。 我添加了trim命令,它在所有Autocad 2009计算机上都能很好地工作,但我们升级到了2011年,出于某种原因,它只输入图层名称,但不修剪线条。有什么想法吗。。。谢谢
;;由Lee编码(defun c:LTAG(/ang entity norm point)(vl load com)(while(if(and(setq entity(entsel))(not(vl-catch-all-error-p)(setq point(vl catch all apply‘vlax curve getclosestpointto(list(car entity)(trans(cadr entity)1 0)))))(progn(setq entity(car entity)norm(trans’(0.0.1)1.0 t))(设置角度(0.0.0.)(trans(vlax curve getfirstderiv entity(vlax curve getparamatpoint entity point))0 norm))(if(and(<(/pi 2.)ang)( 嗨,LISP2LEARN,
快速提示:如果您不使用标签,那么在论坛帖子中的代码格式会更好-如果您使用VLIDE编写代码,可以在以下位置设置此选项:
工具>环境选项>Visual LISP格式选项>[取消选中]插入选项卡
在大多数情况下,将文本插入点提供给Trim命令将选择并尝试修剪文本对象(这是无效的),因此,假设我已经理解了您正在寻找的行为,我的建议如下:
;;由Lee编码(defun c:LTAG(/ang entity norm point text)(vl load com)(while(and(setq entity(entsel))(not(vl-catch-all-error-p(setq point(vl catch all apply‘vlax curve getclosestpointto(list(car entity)(trans(cadr entity)1 0))))))(setq entity(car entity)norm(trans’(0.0.1)1.0 t))(设置角度(0.0.0.)(trans(vlax curve getfirstderiv entity(vlax curve getparamatpoint entity point))0 norm))(if(and(<(/pi 2.)ang)(
页:
[1]
2