明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 835|回复: 14

移到指定点

[复制链接]
发表于 2024-8-29 23:08:24 | 显示全部楼层 |阅读模式
如图,根据原左边图形中的五角星对象移动到右边图示意的结果,虚线只是辅助示意所用

本帖子中包含更多资源

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

x
发表于 2024-9-2 15:58:42 | 显示全部楼层
(defun c:tt(/ dat dxlx en i lst p0 p1 p2 p3 pt pt1 pt2 ptlst sl ss)
        (setq ss(ssget))
        (setq i 0 lst nil sl (sslength ss))
        (repeat sl
                (setq en (ssname ss i));取图元名
    (setq dat (entget en))
                (setq dxlx (cdr (assoc 0 dat)));获取对象的类型
                (if(= dxlx "LWPOLYLINE")(setq coobj en))
                (cond
                        ((= dxlx "POINT")
                                (setq pt (cdr(assoc 10 dat)))
                                (setq lst (cons pt lst))
                        );假设是点对象
                        ((= dxlx  "LINE")
                                (setq pt1 (cdr(assoc 10 dat)))
                                (setq pt2 (cdr(assoc 11 dat)))
                                (if (not (member pt1 lst))(setq lst (cons pt1 lst)))
                                (if (not (member pt2 lst))(setq lst (cons pt2 lst)))
                        );假设是2条直线相交
                        ((= dxlx  "DIMENSION")
                                (setq pt1 (cdr(assoc 13 dat)))
                                (setq pt2 (cdr(assoc 14 dat)))
                                (if (not (member pt1 lst))(setq lst (cons pt1 lst)))
                                (if (not (member pt2 lst))(setq lst (cons pt2 lst)))
                        );假设是标注
                )
                (setq i (1+ i))
        )       
        (cond
                ((= (length lst) 1)
                        (setq p0 (nth 0 lst))
                        (setq p1 (getreal "\n向右距离:"))
            (setq p2 (getreal "\n向上距离:"))
                )
                ((= (length lst) 3)
                        (setq
                                ptlst (vl-sort lst (function (lambda (e1 e2)(< (car e1) (car e2)))))
                                p2 (nth 0 ptlst) p0 (nth 1 ptlst) p1 (nth 2 ptlst);取得3个点
                                p1(distance p0 p1);向右距离
                                p2(distance p0 p2);向上距离
                        )
                )
        )
        (setq p3 (list(+(car p0)p1)(+(cadr p0)p2)))
        (command "copy" coobj "" p0 p3)
        (princ)
)
把能想到几种情况都写进去了
1、已有五角星和一个点
2、已有五角星和三个点
3、已有五角星和两条直线
4、已有五角星和2个标注
发表于 2024-8-30 08:56:34 | 显示全部楼层
(defun c:tt (/ dxname obj p0 p1 p2 p3 ss)
        (setq dxname (car (entsel "\n选择五角星:")))       
        (setq p1 (getreal "\n向右距离:"))
        (setq p2 (getreal "\n向上距离:"))
        (command "explode" dxname )
        (setq ss (ssget "p"))
        (command ".region" ss "")
        (setq dxname (entlast))
        (setq obj (vlax-ename->vla-object dxname))
        (setq p0 (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj))))
        (setq p3 (list (+ (car p0) p1) (+ (cadr p0) p2)))        
        (command "move" dxname "" p0 p3)
        (princ)
)
发表于 2024-8-31 16:35:39 | 显示全部楼层
我简化了 统一网名 网友的代码,你看看行不行。


  1. (defun c:11(/ dxname  p0 p1 p2 p3)
  2.        (if (setq dxname (entsel "\n选择五角星:"))      
  3.        (progn
  4.      (setq p1 (getreal "\n向右距离:"))
  5.         (setq p2 (getreal "\n向上距离:"))
  6.         (setq p0 (osnap (cadr dxname) "nea"))
  7.         (setq p3 (list (+ (car p0) p1) (+ (cadr p0) p2)))        
  8.         (command "copy" dxname "" p0 p3)
  9.     )
  10.     )
  11.         (princ))


发表于 2024-8-30 08:27:16 | 显示全部楼层
计算出方向角和距离,计算出坐标点,再移动就可以了
 楼主| 发表于 2024-8-30 18:02:41 | 显示全部楼层
统一网名 发表于 2024-8-30 08:56
(defun c:tt (/ dxname obj p0 p1 p2 p3 ss)
        (setq dxname (car (entsel "\n选择五角星:")))       
        (setq p1 ...

感谢,但不够完美,有个点选距离的就更完美了,还有分解步骤,没有必要,可以换成是否复制移动
发表于 2024-8-31 02:53:19 来自手机 | 显示全部楼层
复制移动,把  (command "move" dxname "" p0 p3)改为  (command "copy" dxname "" p0 p3)
发表于 2024-8-31 07:40:31 | 显示全部楼层
F海市蜃楼 发表于 2024-8-30 18:02
感谢,但不够完美,有个点选距离的就更完美了,还有分解步骤,没有必要,可以换成是否复制移动

你说的点选距离是点选标注还是点选其它什么,炸开然后形成面域是求五角形质心,根据你需要自己改一下,我只是根据我自己的理解来写一下,实际上我并不清楚你的具体需求。
 楼主| 发表于 2024-8-31 12:52:36 | 显示全部楼层
统一网名 发表于 2024-8-31 07:40
你说的点选距离是点选标注还是点选其它什么,炸开然后形成面域是求五角形质心,根据你需要自己改一下,我 ...

非常感谢回复,我的意思就是如图不管点选标注所示的距离还是输入距离就是从P0点开始,不用求质心,意思就是第一种是从点P0-P1、点P0-P2然后移动(移动复制)到P1竖向和P2横向交点[这个交点就是(x,y)这样的坐标点]的距离。第二种是输入距离就比如横向输入200、竖向输入500,然后移动的终点就相当于坐标(200,500)这样,不知道是否理解
 楼主| 发表于 2024-8-31 12:53:49 | 显示全部楼层
ssyfeng 发表于 2024-8-30 08:27
计算出方向角和距离,计算出坐标点,再移动就可以了

嗯,大概就是这个意思
 楼主| 发表于 2024-8-31 12:55:11 | 显示全部楼层
qazxswk 发表于 2024-8-31 02:53
复制移动,把  (command "move" dxname "" p0 p3)改为  (command "copy" dxname "" p0 p3)

嗯,好的,知道了,谢谢
发表于 2024-8-31 16:18:11 | 显示全部楼层
F海市蜃楼 发表于 2024-8-31 12:52
非常感谢回复,我的意思就是如图不管点选标注所示的距离还是输入距离就是从P0点开始,不用求质心,意思就 ...

你这句话,我看了很久,明白大概的意思,你意思,是不是选择对象,然后在命令行直接输入:200,500  然后就完成了复制移动?如果是这样,也可以实现的。就是不知道你的要求
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-15 01:24 , Processed in 0.211897 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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