找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5477|回复: 20

[已解决] 求文字及块参照呈斜向对齐代码

[复制链接]
发表于 2013-7-25 10:25:33 | 显示全部楼层 |阅读模式
悬赏40D豆已解决
一般我们图元对齐都是在世界坐标系下呈水平或垂直状态的对齐。我想求高手帮写一个代码,使得N个文字以某文字A(也可以是块参照)的包围线中心点及旋转角度确定的一条线对齐,如示意图。当然还希望块参照也如此对齐,因为有一些文字是以块参照存在的。我只是要求块参照的中心也在这条线上,且旋转角度与A相同,块内文字怎么样都不管它。
请高手帮助解决!

QQ截图20130725101648.png

文字及块参照呈斜向对齐.rar

67.65 KB, 下载次数: 8, 下载积分: D豆 -1 , 活跃度 1

最佳答案

查看完整内容

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

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-25 10:25:34 | 显示全部楼层
XD::UCS:Angle 源码

  1. ;|
  2. 获得UCS的X轴夹角
  3. 参数:无
  4. 返回值: 弧度

  5. |;

  6. (defun XD::UCS:Angle( / an xdir)
  7.    (setq xDir (getvar "ucsxdir")
  8.          an (xdrx_vector_dotproduct xDir '(1.0 0.0 0.0))
  9.          an (atan (/ (sqrt (- 1 (* an an))) an))
  10.    )
  11. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-7-25 11:06:33 | 显示全部楼层
本帖最后由 st788796 于 2013-7-25 11:08 编辑

给个建议吧,矩阵啥的有点复杂,用 align 函数,先要加载 geom3d.arx 或者 acGeomUI.arx

Translates and rotates objects, allowing them to be aligned with other objects (externally defined: geom3d ObjectARX application)

(align arg1 arg2 ...)

Arguments

arg1 arg2...

Arguments to the AutoCAD align command. The order, number, and type of arguments for the align function are the same as if you were entering ALIGN at the command line.

To indicate a null response (a user pressing ENTER), specify nil or an empty string ("").

Return Values

T if successful; otherwise nil.

Examples

The following example specifies two pairs of source and destination points, which perform a 2D move:

(setq ss (ssget))
(align ss s1 d1 s2 d2 "" "2d")

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

使用道具 举报

发表于 2013-7-25 11:10:54 | 显示全部楼层
顶一个,俺不懂lsp,只会用啊,同样期待高手
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-25 13:50:10 | 显示全部楼层
2楼全英文,我不懂
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-26 01:33:41 | 显示全部楼层
俺好像跟错帖子了,来领赏了。

函数发布,修改了,请看新的 http://bbs.xdcad.net/thread-669871-1-1.html
XD::Entity:BOX 也重新下载下源码,有更新。


                               
登录/注册后可看大图



  1. (defun XD::Entity:BOXatECS (ss e / box)
  2.   (xdrx_sysvar_push '("expert" 5) '("ucsicon" 0) '("cmdecho" 0))
  3.   (command "ucs" "ob" e)
  4.   (setq box (XD::Pnts:UCS2WCS (XD::Entity:BOX ss)))
  5.   (command "._ucs" "p")
  6.   (setq box (XD::Pnts:WCS2UCS BOX))
  7.   (xdrx_sysvar_pop)
  8.   box
  9. )




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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-26 02:32:08 | 显示全部楼层
写个一个 文字对齐的插件,去看看: http://bbs.xdcad.net/thread-669874-1-1.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-26 08:19:03 | 显示全部楼层
谢谢您!
水平或垂直对齐的很多,我要的是斜向在一条线上的对齐。

点评

我好像才看明白你的意思,你想要的是平齐,不是对齐。 这个我以前就写过一个函数的,可以直接拿来用: 见 http://www.xdcad.net/forum/thread-669124-1-1.html 构造ALIGN变换矩阵。 用我上面提供的函数 XD::En  详情 回复 发表于 2013-7-26 08:35
你没拿那个程序试试斜的文字? 其实那个 包围盒就已经解决问题了,文字对齐只是一个应用而已。  详情 回复 发表于 2013-7-26 08:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-7-26 08:22:52 | 显示全部楼层
清风明月10 发表于 2013-7-26 08:19
谢谢您!
水平或垂直对齐的很多,我要的是斜向在一条线上的对齐。

你没拿那个程序试试斜的文字?

其实那个 包围盒就已经解决问题了,文字对齐只是一个应用而已。

点评

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-26 08:35:46 | 显示全部楼层
清风明月10 发表于 2013-7-26 08:19
谢谢您!
水平或垂直对齐的很多,我要的是斜向在一条线上的对齐。

我好像才看明白你的意思,你想要的是平齐,不是对齐。

这个我以前就写过一个函数的,可以直接拿来用: 见 http://www.xdcad.net/forum/thread-669124-1-1.html

构造ALIGN变换矩阵。 用我上面提供的函数 XD::Entity:BoxAtECS,得到文字或者块的实际包围盒, Ps1=(car box) , ps2 = (cadr box) 就是底边了。 然后你得得下面那个线的起点和端点,线上两个点就行, PD1 PD2,

然后就把ALIGN变换矩阵写出来了。

(XD::Matrix:Align ps1 ps1 pd1 ps2 pd2)

作用到文字或块就转过来了。

  1. ;|
  2. 构造对齐矩阵
  3. 参数:
  4.    pj ---- 基点  ps1---- 源点1   ps2---- 源点2   pd1---- 目标点1   pd2---- 目标点2
  5. 返回值:矩阵
  6. |;
  7. (defun XD::Matrix:Align (pj ps1 pd1 ps2 pd2 / fromx fromy from tox toy to mMat )
  8.   (setq fromx (xdrx_vector_normalize (mapcar
  9.                                        '-
  10.                                        (trans ps2 1 0)
  11.                                        (trans ps1 1 0)
  12.                                      )
  13.               )
  14.         fromy (xdrx_vector_perpvector fromx)
  15.         fromz (xdrx_vector_crossproduct fromx fromy)
  16.         from (list (trans pj 1 0) fromx fromy fromz)
  17.         tox (xdrx_vector_normalize (mapcar
  18.                                      '-
  19.                                      (trans pd2 1 0)
  20.                                      (trans pd1 1 0)
  21.                                    )
  22.             )
  23.         toy (xdrx_vector_perpvector tox)
  24.         toz (xdrx_vector_crossproduct tox toy)
  25.         to (list (trans pd1 1 0) tox toy toz)
  26.         mMat (xdrx_matrix_aligncoordsystem from to)
  27.   )
  28.   mMat
  29. )


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

使用道具 举报

 楼主| 发表于 2013-7-26 08:52:16 | 显示全部楼层
你们叫平齐?我首次听说这个词。那我要的就是平齐 ,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-26 08:53:30 | 显示全部楼层
newer 发表于 2013-7-26 08:22
你没拿那个程序试试斜的文字?

其实那个 包围盒就已经解决问题了,文字对齐只是一个应用而已。

试了没效果。我在LISP上是菜鸟,不 会试

点评

给你写个程序吧, 你觉得叫 平齐 不贴切吗? 对齐的变换矩阵源代码,见我上面给你的帖子链接。你没发现吗,晓东通用函数库和API,把很多东西都做好了,你写程序的代码就很短了。 [attachimg]4491[/attachimg]  详情 回复 发表于 2013-7-26 09:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-26 09:14:12 | 显示全部楼层
本帖最后由 Lispboy 于 2013-7-26 09:15 编辑
清风明月10 发表于 2013-7-26 08:53
试了没效果。我在LISP上是菜鸟,不 会试

给你写个程序吧, 你觉得叫 平齐 不贴切吗?
对齐的变换矩阵源代码,见我上面给你的帖子链接。你没发现吗,晓东通用函数库和API,把很多东西都做好了,你写程序的代码就很短了。下面程序代码你要想了解思路,那么就发帖,我试着帮你解释。

xdtb_objalign.gif

  1. (defun c:XDTB_ObjAlign ( / box1 e1 e2 mat p1 pd1 pd2 ps1 ps2 v)
  2.   (if (and
  3.         (setq e1 (xdrx_entsel "\n拾取平齐的基线<退出>:" '((0 . "LINE,*POLYLINE"))))
  4.         (setq e2 (car (xdrx_entsel "\n选取要平齐的对象<退出>:")))
  5.       )
  6.     (progn
  7.       (setq box1 (XD::Entity:BoxAtEcs e2 e2)
  8.             ps1 (car box1)
  9.             ps2 (cadr box1)
  10.             p1 (cadr e1)
  11.             e1 (car e1)
  12.             pd1 (xdrx_curve_getClosestPoint e1 p1)
  13.             v (xdrx_curve_getFirstDeriv e1 p1)
  14.             pd2 (mapcar
  15.                   '+
  16.                   p1
  17.                   v
  18.                 )
  19.             mat (XD::Matrix:Align ps1 ps1 pd1 ps2 pd2)
  20.       )
  21.       (xdrx_entity_transform e2 mat)
  22.     )
  23.   )
  24.   (princ)
  25. )



正式发布时候可能要完善下。

点评

选取要平齐的对象:; 错误: no function definition: XD::UCS:ANGLE 很多这样的错误,我加载了晓东的这些文件(“CJ001089晓东API函数xdrx_api16.arx” 、“ CJ001112晓东开源通用LISP函数库Build 2013.07.23XD-LIS  详情 回复 发表于 2013-7-26 10:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-7-26 10:58:02 | 显示全部楼层
Lispboy 发表于 2013-7-26 09:14
给你写个程序吧, 你觉得叫 平齐 不贴切吗?
对齐的变换矩阵源代码,见我上面给你的帖子链接。你没发现 ...

选取要平齐的对象<退出>:; 错误: no function definition: XD::UCS:ANGLE
很多这样的错误,我加载了晓东的这些文件(“CJ001089晓东API函数xdrx_api16.arx” 、“ CJ001112晓东开源通用LISP函数库Build 2013.07.23XD-LISP-LIB.VLX”)啊,怎么还缺函数

点评

你确信加载了最新的 晓东通用LISP函数库,现在是0726版,加载时候会提示的,因为函数在随时增加,所以要用最新的。 你看下图片 [attachimg]4494[/attachimg]  详情 回复 发表于 2013-7-26 11:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-7-26 11:24:36 | 显示全部楼层
清风明月10 发表于 2013-7-26 10:58
选取要平齐的对象:; 错误: no function definition: XD::UCS:ANGLE
很多这样的错误,我加载了晓东的这 ...

你确信加载了最新的 晓东通用LISP函数库,现在是0726版,加载时候会提示的,因为函数在随时增加,所以要用最新的。

你看下图片

QQ截图20130726112315.jpg

点评

代码是可以达到我的目标,只是对多行文字无效,如果对多行文字有效就好了,或者对所有图元有效更好  详情 回复 发表于 2013-7-26 14:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 22:30 , Processed in 0.300040 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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