zilong136 发表于 2024-3-6 20:21:04

如何写参照旋转、缩放?

本帖最后由 zilong136 于 2024-3-6 23:12 编辑

如下图所示,参照旋转要求把线1旋转到线2重合

操作步骤:拾取旋转对象1~拾取A~拾取B~拾取C~拾取D,完成。

参照缩放同理。


以下源码来源于三领作者陈师父的赠送

【作者:烟台优构建筑设计咨询有限公司
   总经理:陈传建 QQ 15290049 手机:13806453956(微信同号)】



[*];;;1.参照旋转【rr】
[*](defun c:rr (/ ss p0 p1 p2 p3 p4)
[*](prompt "\n rr:参照旋转")
[*](setq ss (ssget))
[*](setq p0 (getpoint "\n 原图基点:"))
[*](setq p1 (getpoint p0 "\n 原图参照点:"))
[*](setq p2 (getpoint p1 "\n 目标定位基点:"))
[*](command "move" ss "" "_non" p0 "_non" p2)
[*](setq p4 (polar p2 (angle p0 p1) (distance p0 p1)))
[*](command "_.rotate" ss "" "_non" p2 "R" p2 p4 pause)
[*])


[*];;;2.参照缩放【sr】
[*](defun c:sr (/ s p1 p2 p3 p4)
[*](prompt "\n sr:参照缩放")
[*](setq s (ssget))
[*](setq p1 (getpoint "\n 原图基点:"))
[*](setq p2 (getpoint p1 "\n 原图参照点:"))
[*](setq p3 (getpoint p2 "\n 目标定位基点:"))
[*](setq p4 (getpoint p1 "\n 目标参照点:"))
[*](command "_.move" s "" "_non" p1 "_non" p3)
[*](command "_.rotate" s "" "_non" p3 "R" p3 (polar p3 (angle p1 p2) (distance p1 p2)) p4)
[*](command "_.scale" s "" "_non" p3 (/ (distance p3 p4) (distance p1 p2)))
[*])


飞雪神光 发表于 2024-3-6 21:28:05

不移动 怎么重合呢

zilong136 发表于 2024-3-6 21:38:03

飞雪神光 发表于 2024-3-6 21:28
不移动 怎么重合呢

三领的那个D-D-参照就是按我意写的。

飞雪神光 发表于 2024-3-6 21:40:10

zilong136 发表于 2024-3-6 21:38
三领的那个D-D-参照就是按我意写的。

那就不清楚了 没见过

弥勒 发表于 2024-3-6 22:13:56

两条线,分别计算方位角,长度,旋转方位角差值,缩放距离比例。

kucha007 发表于 2024-3-6 22:58:59

CAD的对齐命令,对齐的时候不要选缩放不就行了?

你有种再说一遍 发表于 2024-3-6 22:59:46

本帖最后由 你有种再说一遍 于 2024-3-6 23:28 编辑

仿cad的al对齐功能呢?
先不考虑捕捉点的用户坐标系转换,全部是世界坐标系.
两条线平移到原点.
求cd线和x轴的三个轴旋转角度:jkl.
ab线旋转和x轴重合,这一步加缩放,然后再根据jkl旋转.
这样就完成了.
你会发现做出来的功能在三维重合时可能和cad的不太一样,因为当前可视面是对齐面(或者鼠标),这个需要处理一下.(不同版本的cad提供了交互点数量不一样,所以cad也修改了bug)


说简单不简单,我敲了三百行的c#代码,不过有思路了你已经可以更快敲好.

飞雪神光 发表于 2024-3-6 23:32:22

那这还是移动了啊 两个里面都有 move

zilong136 发表于 2024-3-6 23:37:13

飞雪神光 发表于 2024-3-6 23:32
那这还是移动了啊 两个里面都有 move
可能是我没表达清楚吧,我本意想表达的是不能输入MOVE命令,但程序可以集成移动命令,只是不用人为来输入而已。
页: [1]
查看完整版本: 如何写参照旋转、缩放?