乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 21|回复: 14

[编程交流] 需要文字放置方面的帮助

[复制链接]

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 09:12:44 | 显示全部楼层 |阅读模式
我试着把层名放在线的中间(而不是中点)。还有,我怎样才能得到所选线条的角度,这样我就可以把文字平行于所选线条。谢谢
 
 
  1. (defun mip-text-entmake (txt pnt height rotation justification / ent_list)
  2. ;;; borrowed from ShaggyDoc
  3. ;;; http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=23&TID=30276
  4. (setq  ent_list (list  '(0 . "TEXT")
  5.     '(100 . "AcDbEntity")
  6.     '(100 . "AcDbText")
  7.     (list 10 (car pnt) (cadr pnt) 0.0)
  8.     (cons 1 txt)
  9.     (cons 40 height)
  10.     (cons 7 (getvar "TEXTSTYLE"))
  11.     (if justification
  12.       (cond
  13.         ((= justification "C")
  14.          '(72 . 1)
  15.         )
  16.         ((= justification "R")
  17.          '(72 . 2)
  18.         )
  19.         ((= justification "A")
  20.          '(72 . 3)
  21.         )
  22.         ((= justification "M")
  23.          '(72 . 4)
  24.         )
  25.         ((= justification "F")
  26.          '(72 . 5)
  27.         )
  28.         (t
  29.          '(72 . 0)
  30.         )
  31.       ) ;_ end of cond
  32.       '(72 . 0)
  33.     ) ;_ end of if
  34.     (cons 50 rotation)
  35.     (list 11 (car pnt) (cadr pnt) 0.0)
  36.     ) ;_ end of list
  37.   ) ;_ end of setq
  38.   (setq ent_list (entmakex ent_list))
  39. )
  40. (defun C:TEST (/ selobj #line)
  41. (setq selobj (entsel))
  42. (setq #line (cdr (assoc 8 (entget (car selobj)))))
  43. (and
  44.    (setq pt (getpoint "\nPick center text point: "))
  45.    (setq pt (trans pt 1 0))
  46.    (mip-text-entmake
  47.      #line           ;;; text
  48.       pt                   ;;; point
  49.      (getvar "TEXTSIZE") ;;; heigth
  50.      [color="red"]0[/color]                     ;;; rotation
  51.      "C"                   ;;; justification
  52.      )
  53.    )
  54. )

101244jskxubfc7bxzk75q.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:21:25 | 显示全部楼层
保持代码与现有代码相似,程序可以是这样的:
 
然而,上述方法仅适用于平行于WCS平面的UCS平面,也不能确保指定点位于选定线上。
 
如果您不想为文本指定点,则可以如下所示:
 
  1. (defun c:test2 ( / ang entity norm point ) (vl-load-com)
  2. (if
  3.    (and (setq entity (entsel))
  4.      (not
  5.        (vl-catch-all-error-p
  6.          (setq point
  7.            (vl-catch-all-apply 'vlax-curve-getclosestpointto
  8.              (list (car entity) (trans (cadr entity) 1 0))
  9.            )
  10.          )
  11.        )
  12.      )
  13.    )
  14.    (progn
  15.      (setq entity (car entity)
  16.            norm   (trans '(0. 0. 1.) 1 0 t)
  17.      )
  18.      (setq ang
  19.        (angle '(0. 0. 0.)
  20.          (trans
  21.            (vlax-curve-getfirstderiv entity
  22.              (vlax-curve-getparamatpoint entity point)
  23.            )
  24.            0 norm
  25.          )
  26.        )
  27.      )
  28.      (if (and (< (/ pi 2.) ang) (<= ang (/ (* 3. pi) 2.)))
  29.        (setq ang (- ang pi))
  30.      )
  31.      (setq point (trans point 0 norm))
  32.      (entmakex
  33.        (list
  34.          (cons 0 "TEXT")
  35.          (cons 7  (getvar 'TEXTSTYLE))
  36.          (cons 40 (getvar 'TEXTSIZE))
  37.          (cons 10 point)
  38.          (cons 11 point)
  39.          (cons 1 (cdr (assoc 8 (entget entity))))
  40.          (cons 50 ang)
  41.          (cons 72 1)
  42.          (cons 73 2)
  43.          (cons 210 norm)
  44.        )
  45.      )
  46.    )
  47. )
  48. (princ)
  49. )

 
 
 
 
  1. (defun C:test (/ p1 p2 angline)
  2. (setq selobj (entget (entsel)))
  3. (setq p1 (car (cdr (assoc 10 selobj))))
  4. (setq p2 (car (cdr (assoc 11 selobj))))
  5. (princ (angle p1 p2))
  6. (princ)
  7. )

 
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 09:29:11 | 显示全部楼层
 

 
  1. 4
回复

使用道具 举报

11

主题

98

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 09:41:04 | 显示全部楼层
 
我不理解你说的“浪费”的话——你能详细解释一下吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:45:55 | 显示全部楼层
 
浪费不是最好的选择。主要是易读性;不是每个人第一眼就知道dxf组40和50是什么,但任何人都可以分别读取vla put textHeight和vla put rotation,或任何其他性质。
 
此外,我应该花点时间承认,虽然vlisp本质上比vanilla快,但entmake的情况并非如此。
回复

使用道具 举报

11

主题

98

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-6 09:50:56 | 显示全部楼层
我添加了trim命令,它在所有Autocad 2009计算机上都能很好地工作,但我们升级到了2011年,出于某种原因,它只输入图层名称,但不修剪线条。有什么想法吗。。。谢谢
 
 
 
[code];;由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)(
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:52:12 | 显示全部楼层
嗨,LISP2LEARN,
 
快速提示:如果您不使用标签,那么在论坛帖子中的代码格式会更好-如果您使用VLIDE编写代码,可以在以下位置设置此选项:
 
工具>环境选项>Visual LISP格式选项>[取消选中]插入选项卡
 
在大多数情况下,将文本插入点提供给Trim命令将选择并尝试修剪文本对象(这是无效的),因此,假设我已经理解了您正在寻找的行为,我的建议如下:
 
[code];;由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)(
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 06:18 , Processed in 0.721234 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表