找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7604|回复: 46

[求助] 哪位有:文字齐线中点 工具,谢谢

[复制链接]

已领礼包: 202个

财富等级: 日进斗金

发表于 2013-9-30 17:23:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 sixthsixth 于 2013-9-30 22:15 编辑

哪位有:文字齐线中点 工具,谢谢
0.jpg

我想把文字中点移到附近红色直线的中点,能不能实现这个功能呢,要能批量选择,批量移动,谢谢图纸如下:
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:文字齐线中点.dwg.rar 
下载次数:17  文件大小:12.16 KB 
下载权限: 不限 以上  [免费赚D豆]


111.jpg


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-1 15:09:48 | 显示全部楼层
本帖最后由 newer 于 2013-10-1 15:13 编辑
sixthsixth 发表于 2013-10-1 14:39
我是个菜鸟,上面两位老大的回复,我看不太懂耶,单独lisp能不能解决呢

去下载 XDRX API 和晓东通用LISP函数库,加载它们,然后执行下面测试代码,你不小心写歪的文字也能帮你调正:
代码里面设定了红色线在TEXT图层。


xdtb_txtalign1.gif


  1. (defun c:tt ( / box dest e ept height mat mid ml p1 p2 position spt ss ss1 vec)
  2.   (if (setq ss (ssget '((0 . "text"))))
  3.     (progn
  4.       (XD::Begin)
  5.       (xdrx_setsstodb ss 0)
  6.       (while (setq e (xdrx_getentdata 0))
  7.         (setq box (XD::Entity:BoxAtEcs e e)
  8.               box (XD::Geom:Box->9PT box)
  9.               position (nth 1 box)
  10.               p1 (nth 0 box)
  11.               p2 (nth 2 box)
  12.               height (xdrx_getpropertyvalue e "Height")
  13.               ss1 (xdrx_pickset_GetAtPoint position height 2 '((0 . "LINE") (8 . "TEXT")
  14.                                             (62 . 1)
  15.                                            )
  16.                   )
  17.         )
  18.         (if ss1
  19.           (progn
  20.             (setq mL (xdrx_getentdata 2)
  21.                   mid (xdrx_getpropertyvalue mL "MidPoint")
  22.                   sPt (xdrx_getpropertyvalue mL "StartPoint")
  23.                   ePt (xdrx_getpropertyvalue mL "EndPoint")
  24.                   dest (list sPt ePt)
  25.                   vec (mapcar
  26.                         '-
  27.                         ePt
  28.                         sPt
  29.                       )
  30.                   dest (if (or (minusp (car vec))(minusp (cadr vec)))
  31.                          (reverse dest)
  32.                          dest
  33.                        )
  34.                   mat (XD::Matrix:Align position position mid p2 (cadr dest))
  35.             )
  36.             (xdrx_entity_transform e mat)
  37.           )
  38.         )
  39.       )
  40.       (XD::End)
  41.     )
  42.   )
  43.   (princ)
  44. )



通用LISP函数库里面的对齐函数,帮你贴下
  1. ;|
  2. 构造对齐矩阵
  3. 参数:
  4.    pj ---- 基点
  5.    ps1---- 源点1
  6.    ps2---- 源点2
  7.    pd1---- 目标点1
  8.    pd2---- 目标点2

  9. 返回值:矩阵
  10. |;
  11. (defun XD::MATRIX:ALIGN (pj ps1 pd1 ps2 pd2 / fromx fromy from tox toy to
  12.                                mMat
  13.                            )
  14.   (setq fromx (xdrx_vector_normalize (mapcar
  15.                                        '-
  16.                                        (trans ps2 1 0)
  17.                                        (trans ps1 1 0)
  18.                                      )
  19.               )
  20.         fromy (xdrx_vector_perpvector fromx)
  21.         fromz (xdrx_vector_crossproduct fromx fromy)
  22.         from (list (trans pj 1 0) fromx fromy fromz)
  23.         tox (xdrx_vector_normalize (mapcar
  24.                                      '-
  25.                                      (trans pd2 1 0)
  26.                                      (trans pd1 1 0)
  27.                                    )
  28.             )
  29.         toy (xdrx_vector_perpvector tox)
  30.         toz (xdrx_vector_crossproduct tox toy)
  31.         to (list (trans pd1 1 0) tox toy toz)
  32.         mMat (xdrx_matrix_aligncoordsystem from to)
  33.   )
  34.   mMat
  35. )


点评

积分好长得好慢啊 想学下API 都下载不了  详情 回复 发表于 2014-4-22 19:36
2010 用楼主的图测试程序,没有任何反应。。  详情 回复 发表于 2013-10-1 16:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-30 17:29:29 | 显示全部楼层
本帖最后由 st788796 于 2013-9-30 17:30 编辑

线和文字排行列,就近移动,靠的太近可能不好办
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2013-9-30 18:01:34 | 显示全部楼层
能不能多提示下啊,这个我没思路

点评

给你提供个思路,为了写起来顺手用了 API 2011 以上的 getpropertyvalue 函数,不过参照这些你可以用 alisp 写  详情 回复 发表于 2013-10-1 11:39
线一个集合,文字一个集合 遍历文字,找出线集中离文字最近的,移动文字  详情 回复 发表于 2013-10-1 06:08
你把结果图在贴个上来。 要批量,就必须文字和那个红色的线有关联,比如指定层或者其他,你有什么规则吗? 如果没规则,那文字边上要是有好几条红色的线,你对齐哪个?  详情 回复 发表于 2013-9-30 19:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-30 19:57:22 | 显示全部楼层
sixthsixth 发表于 2013-9-30 18:01
能不能多提示下啊,这个我没思路

你把结果图在贴个上来。

要批量,就必须文字和那个红色的线有关联,比如指定层或者其他,你有什么规则吗? 如果没规则,那文字边上要是有好几条红色的线,你对齐哪个?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-10-1 06:08:23 来自手机 | 显示全部楼层
sixthsixth 发表于 2013-9-30 18:01
能不能多提示下啊,这个我没思路

线一个集合,文字一个集合
遍历文字,找出线集中离文字最近的,移动文字
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-1 11:39:53 | 显示全部楼层
本帖最后由 st788796 于 2013-10-1 11:43 编辑
sixthsixth 发表于 2013-9-30 18:01
能不能多提示下啊,这个我没思路

给你提供个思路,为了写起来顺手用了 API 2011 以上的 getpropertyvalue 函数,不过参照这些你可以用 alisp 写
对齐计算还不是很好,自行修改
  1. (defun c:tt (/ ss e typ box vx an inspt tl ll lst mat)
  2.   (if (setq ss (ssget '((0 . "text,line"))))
  3.     (progn
  4.       (xdrx_setsstodb ss 0)
  5.       (while (setq e (xdrx_getentdata 0))
  6. (setq typ (xdrx_getentdxf 0))
  7. (if (= typ "TEXT")
  8.    (progn
  9.      (setq el (entget e))
  10.      (setq box (textbox (list (assoc 1 el) (assoc 40 el) (assoc 7 el)) ;_ 相对于 0 0 0 的Box
  11.    )
  12.     vx (- (caadr box) (caar box))
  13.     an (xdrx_getentdxf 50)
  14.     inspt (xdrx_getentdxf 10)
  15.      )
  16.      (setq tl
  17.      (cons
  18.        (list (mapcar '+ (polar '(0. 0. 0.) an vx) inspt) e) ;_文字底中点
  19.        tl
  20.      )
  21.      )
  22.    )
  23.    (setq ll (cons (list (cadr (xdrx_curve_getpoint e)) e) ll)) ;_((线1中点 线1) (线2中点 线2) ...)
  24. )
  25.       ) ;_end while
  26.       (setq mat (xdrx_matrix_identity 3))
  27.       (foreach txt tl
  28. (setq
  29.    lst (vl-remove-if-not
  30.   '(lambda (x)
  31.      (equal
  32.        (getpropertyvalue (cadr txt) "Rotation")
  33.        (rem
  34.          (getpropertyvalue (cadr x) "Angle")
  35.          pi
  36.        )
  37.        0.0001 ;_误差角度
  38.      )
  39.    )
  40.   ll
  41.        )
  42. ) ;_过滤出和文字角度相同的线
  43. (if lst
  44.    (progn
  45.      (setq lst (vl-sort lst
  46.           '(lambda (l1 l2) ;_ 按远近排序
  47.       (< (distance (car txt) (car l1))
  48.          (distance (car txt) (car l2))
  49.       )
  50.     )
  51.         )
  52.      )
  53.      (xdrx_entity_transform;_可以用 vl-move
  54.        (cadr txt)
  55.        (xdrx_matrix_settranslation
  56.   mat
  57.   (mapcar '- (caar lst) (car txt))
  58.        )
  59.      )
  60.    )
  61. )
  62.       )
  63.     )
  64.   )
  65.   (princ)
  66. )


点评

这个用API的对齐方面的函数,代码能更短,而且更通用,不平行线的文字也能给调整齐了。LISP通用函数库里面都有相关的函数。  详情 回复 发表于 2013-10-1 12:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-1 12:27:10 | 显示全部楼层
st788796 发表于 2013-10-1 11:39
给你提供个思路,为了写起来顺手用了 API 2011 以上的 getpropertyvalue 函数,不过参照这些你可以用 ali ...

这个用API的对齐方面的函数,代码能更短,而且更通用,不平行线的文字也能给调整齐了。LISP通用函数库里面都有相关的函数。

点评

长的部分代码都在库里了  详情 回复 发表于 2013-10-1 12:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-10-1 12:49:41 来自手机 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-10-1 13:20 编辑
newer 发表于 2013-10-1 12:27
这个用API的对齐方面的函数,代码能更短,而且更通用,不平行线的文字也能给调整齐了。LISP通用函数库里 ...


长的部分代码都在库里了:)
对line API函数xdrx_getpropertyvalue 没有 angle 属性?
利用xd-lisp-lib 库,求text 的底边线,与line构造对齐矩阵,排序部分没有其它简化,就是过滤表根据需要改造以提高准确性和效率

点评

angle 属性下版本加上。 构造选择集,可以用过一点的API选择集函数构造,  详情 回复 发表于 2013-10-1 13:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-1 13:21:56 | 显示全部楼层
Free-Lancer 发表于 2013-10-1 12:49
长的部分代码都在库里了
对line xdrx_getpropertyvalue 没有 angle 属性
利用xd-lisp-lib 库,求te ...

angle 属性下版本加上。

构造选择集,可以用过一点的API选择集函数构造,拾取框半宽可以用文字的高度,选择到的红线根据文字特征点排下序,找到最近的红线,然后文字的9PT的中下点和线的中点对齐。

构造通过一点的符合过滤要求的实体选择集

调用格式:
(xdrx_pickset_getAtPoint <pt> [提示字符串] [拾取窗半宽] [层名] [内部数据库选择集编号][过滤表])

返 回 值:
选择集
说    明:
1.层名: 可以写作 "abc", "a*", "a??", "*" 等, 省略层名等价于 "*"。

2.内部数据库选择集编号: 该参数为 1 - 10, 将取得的选择集存入xdrx内部数据库中的 ARX 变量, 并将 (ssname) 当前实体指针 i 置 0。

3.过滤表为LISP中的过滤表,如'((8 . "abc")(0 . "line")....),也支持AND,OR,NOT等

4.若过滤表中提供层组码8,则前面的“层名”选项不起作用。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-1 13:40:20 | 显示全部楼层
(xdrx_getpropertyvalue (car (entsel)))

选择对象:
Class AcDbLine:

    ├─Angle
    ├─Thickness
    ├─Normal

Class AcDbCurve:

    ├─Area
    ├─EndParam
    ├─EndPoint
    ├─IsClosed
    ├─IsPeriodic
    ├─MidPoint
    ├─StartPoint
    ├─StartParam
    ├─Length

Class AcDbEntity:

    ├─BoundingBox
    ├─Color
    ├─ECS
    ├─Layer
    ├─Linetype
    ├─LinetypeScale
    ├─LineWeight
    ├─PlotStyleName
    ├─StretchPoint
    ├─Visibility

Class AcDbObject:

    ├─ClassName
    ├─ExtensionDictionary
    ├─FieldDictionary
    ├─IsA
    ├─IsAProxy
    ├─IsErased
    ├─IsReallyClosing
    ├─Handle
    ├─HasFields
    ├─MyParent
    ├─ObjectID
    ├─Owner
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-10-1 13:45:13 来自手机 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-10-1 13:49 编辑

这次全了,Angle Length可以直接获取会方便很多应用
依每个text构造选集可以减少line选集长度,排序效率就可提高,程序效率自然也高了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2013-10-1 14:39:21 | 显示全部楼层
我是个菜鸟,上面两位老大的回复,我看不太懂耶,单独lisp能不能解决呢

点评

去下载 XDRX API 和晓东通用LISP函数库,加载它们,然后执行下面测试代码,你不小心写歪的文字也能帮你调正: 代码里面设定了红色线在TEXT图层。 [attachimg]5568[/attachimg] 通用LISP函数库里面  详情 回复 发表于 2013-10-1 15:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-10-1 16:04:57 | 显示全部楼层
newer 发表于 2013-10-1 15:09
去下载 XDRX API 和晓东通用LISP函数库,加载它们,然后执行下面测试代码,你不小心写歪的文字也能帮你调 ...

2010 用楼主的图测试程序,没有任何反应。。

点评

你把上面提供的 XD::MATRIX:ALIGN 加载下,再试试。  详情 回复 发表于 2013-10-1 16:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-1 16:27:28 | 显示全部楼层
缺少一个间隙,需要加载 xdapi + xd-lisp-lib.vlx

点评

要间隙,把对齐矩阵里面的基点参数往上面移动点就行了,先让楼主测试吧,有需要再修改。  详情 回复 发表于 2013-10-1 16:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 06:18 , Processed in 0.249274 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表