LISP2LEARN 发表于 2022-7-6 09:12:44

需要文字放置方面的帮助

我试着把层名放在线的中间(而不是中点)。还有,我怎样才能得到所选线条的角度,这样我就可以把文字平行于所选线条。谢谢
 
 
(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
   )
   )
)

BIGAL 发表于 2022-7-6 09:17:24

Assoc 10是起点,11是终点(角度起点-终点)这仅适用于直线,然后(/(距离起点-终点)2.0)这是中点距离,使用(极轴起点-角度距离)是直线上的中点。建议您可以添加一点额外的代码,比较您选择的端点,然后交换开始和结束,使文本正确的一面朝上。面朝下,从右侧。喜欢你的图像或添加旋转选项“is text ok”N旋转180。使用enter作为“Y”,否则其他所有内容都是否定的。
 
重要的是,角度总是以弧度表示,不使用“单位”等。

Lee Mac 发表于 2022-7-6 09:21:25

保持代码与现有代码相似,程序可以是这样的:
 
然而,上述方法仅适用于平行于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)
)
 

LISP2LEARN 发表于 2022-7-6 09:29:11

 

 
4

SOliver 发表于 2022-7-6 09:33:10

 
谢谢LISP2LEARN,不客气
 
和往常一样,如果你对我发布的任何代码有任何问题,只要问我,我很乐意解释
 
 
有很多原因。
 
LISP是为列表操作而设计的,并提供了许多函数。这意味着许多任务使用DXF数据列表要简洁得多,而且,您不需要使用变体和安全数组。
 
DXF结构允许您通过对ent*函数的单个调用来修改实体的任何或所有属性,而无需单独挖掘每个属性。此外,我发现使用Vanilla AutoLISP使程序在所有UCS平面中兼容要容易得多。
 
Vanilla AutoLISP函数(如entmake)通常比Visual LISP等效函数快得多。
 
除此之外,丰富的普通方法使您能够在不访问Visual LISP的情况下为系统编写程序。
 

LISP2LEARN 发表于 2022-7-6 09:37:23

我很欣赏lisp在以下方面提供的灵活性,但我忍不住认为具有恒定列表长度的硬编码(entmake)是一种有点浪费的实现。
 
也就是说,我同意不必使用安全阵列变体绝对是方便的
 
根据Autodesk的说法,vlisp功能比普通功能更及时。
 
我完全同意这两方面的熟练程度(考虑到其他程序(如powercad)实现了这一点,更为普通)很重要;我想这只是我的偏好,离开香草方法的特殊场合笑。
 
为反馈喝彩。

Tharwat 发表于 2022-7-6 09:41:04

 
我不理解你说的“浪费”的话——你能详细解释一下吗?

Lee Mac 发表于 2022-7-6 09:45:55

 
浪费不是最好的选择。主要是易读性;不是每个人第一眼就知道dxf组40和50是什么,但任何人都可以分别读取vla put textHeight和vla put rotation,或任何其他性质。
 
此外,我应该花点时间承认,虽然vlisp本质上比vanilla快,但entmake的情况并非如此。

SOliver 发表于 2022-7-6 09:50:56

我添加了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)(

Lee Mac 发表于 2022-7-6 09:52:12

嗨,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
查看完整版本: 需要文字放置方面的帮助