明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: jack093

[讨论] 恢复被打碎的块

[复制链接]
发表于 2015-12-22 13:36 | 显示全部楼层
楼主,还缺函数呀
发表于 2015-12-22 15:06 | 显示全部楼层
支持楼主,好东西
发表于 2015-12-24 08:00 | 显示全部楼层
支持楼主
发表于 2015-12-24 11:34 | 显示全部楼层
这个真是很有意义哦!有能力的支持支持!
 楼主| 发表于 2015-12-24 16:58 | 显示全部楼层
找到2个bug
1.比较角度前
                            (if (> aann (* 2.0 pi))
                                (setq aann (- aann (* 2.0 pi)))
                            )
                            (if (< aann (* -1.0 pi))
                                (setq aann (+ aann (* 2.0 pi)))
                            )
否则旋转对象无法匹配
2.变量an因为ang

(defun points_2_mrs(p1 p2 p1a ang sc /  an sc x1 y1 x1a y1a x3 y3 x1s y1s ang13 d1s3 x3s y3s)
    (setq x1 (car p1)y1 (cadr p1))
    (setq x1a (car p1a)y1a (cadr p1a))
    (setq x2 (car p2)y2 (cadr p2))
    ;;scale p2不动
    (setq x1s (+ (* sc x1) (* (- 1 sc) x2)))
    (setq y1s (+ (* sc y1) (* (- 1 sc) y2)))
    ;;rotate p1不动 后 p2坐标
    (setq ang12 (angle p1 p2))
    (setq d1s2 (sqrt(+ (*(- x1s x2)(- x1s x2))(*(- y1s y2)(- y1s y2)))))
    (setq x2s (+ (* (cos (+ ang ang12)) d1s2)x1s))
    (setq y2s (+ (* (sin (+ ang ang12)) d1s2)y1s))
    ;;move p1移到p1a 后 p2坐标
    (list (+ x2s (- x1a x1s))(+ y2s (- y1a y1s))0)
)
已经可以对固定比例,旋转变比的匹配了(xyz不同比例不能匹配)
还剩下其它图元支持了
 楼主| 发表于 2016-1-6 15:26 | 显示全部楼层
本帖最后由 jack093 于 2016-1-6 16:49 编辑

支持图元增加

(defun find_eq_ent(ent ent2 pt p3 ang sc /  flag ret nm p1 p2 p1a p2a aann sscc ptt r1 r2 a1 a2)
    (setq flag nil ret nil)
    (setq nm (cdr (assoc 0 ent)))
    (setq p1 (cdr (assoc 10 ent)) p2 (cdr (assoc 10 ent2)))
    (if (and
            (= nm(cdr (assoc 0 ent2)))
            (= (cdr (assoc 8 ent))(cdr (assoc 8 ent2)))
            (= (cdr (assoc 62 ent))(cdr (assoc 62 ent2)))
            (= (cdr (assoc 6 ent))(cdr (assoc 6 ent2)))
            (= (cdr (assoc 48 ent))(cdr (assoc 48 ent2)))
        )
        (cond
            ((= nm "LINE")
                (setq p1a (cdr (assoc 11 ent)) p2a (cdr (assoc 11 ent2)))
                (setq sscc (/ (distance p2 p2a)(distance p1 p1a)))
                (if (null sc)
                    (setq sc sscc)
                    (if (null(equal sc sscc 1e-7))
                        (setq flag t)
                    )
                )
                (if (null flag)
                    (progn
                        (setq aann (- (angle p2 p2a)(angle p1 p1a)))
                        (if (> aann (* 2.0 pi))
                            (setq aann (- aann (* 2.0 pi)))
                        )
                        (if (< aann (* -1.0 pi))
                            (setq aann (+ aann (* 2.0 pi)))
                        )
                        (if (null ang)
                            (setq ang aann)
                            (if (null(eq_angle_pi ang aann))
                                (setq flag t)
                            )
                        )
                    )
                )
                (if (null flag)
                    (progn
                        ;;(setq ptt (triangle_2_mrs p1 p1a pt p2 p2a))
                        (setq ptt (points_2_mrs (midpoint p1 p1a) pt (midpoint p2 p2a) ang sc))
                        (if (null p3)
                            (setq p3 ptt)
                            (if (null(equal p3 ptt 1e-7))
                                (setq flag t)
                            )
                        )
                        (if (null flag)
                            (setq ret (list p3 ang sc))
                        )
                    )
                )
            )
            ((or(= nm "TEXT")(= nm "MTEXT"))
                (if (and(= (cdr (assoc 1 ent))(cdr (assoc 1 ent2)))
                        (= (cdr (assoc 7 ent))(cdr (assoc 7 ent2)))
                        (= (cdr (assoc 71 ent))(cdr (assoc 71 ent2)))
                        (= (cdr (assoc 72 ent))(cdr (assoc 72 ent2)))
                    )
                    (progn
                        (setq a1 (cdr (assoc 50 ent))a2(cdr (assoc 50 ent2)))
                        (setq aann (- a2 a1))
                        (if (> aann (* 2.0 pi))
                            (setq aann (- aann (* 2.0 pi)))
                        )
                        (if (< aann (* -1.0 pi))
                            (setq aann (+ aann (* 2.0 pi)))
                        )
                        (if (null ang)
                            (setq ang aann)
                            (if (null(eq_angle ang aann))
                                (setq flag t)
                                (progn
                                    (setq sscc (/ (cdr (assoc 40 ent2))(cdr (assoc 40 ent))))
                                    (if (null sc)
                                        (setq sc sscc)
                                        (if (null(equal sc sscc 1e-7))
                                            (setq flag t)
                                            (progn
                                                (setq ptt (points_2_mrs p1 pt p2 ang sc))
                                                (if (null p3)
                                                    (setq p3 ptt)
                                                    (if (null(equal p3 ptt 1e-7))
                                                        (setq flag t)
                                                    )
                                                )
                                                (if (null flag)
                                                    (setq ret (list p3 ang sc))
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
            ((= nm "CIRCLE")
                (setq sscc (/ (cdr (assoc 40 ent2))(cdr (assoc 40 ent))))
                (if (null(equal sc sscc 1e-7))
                    (setq flag t)
                    (progn
                        (setq ptt (points_2_mrs p1 pt p2 ang sc))
                        (if (null(equal p3 ptt 1e-7))
                            (setq flag t)
                            (setq ret (list p3 ang sc))
                        )
                    )
                )
            )
            
            ((= nm "DIMENSION")
                (setq p1a (cdr (assoc 11 ent)) p2a (cdr (assoc 11 ent2)))
                (setq sscc (/ (distance p2 p2a)(distance p1 p1a)))
                (if (null sc)
                    (setq sc sscc)
                    (if (null(equal sc sscc 1e-7))
                        (setq flag t)
                    )
                )
                (if (null flag)
                    (progn
                        (setq aann (- (angle p2 p2a)(angle p1 p1a)))
                        (if (> aann (* 2.0 pi))
                            (setq aann (- aann (* 2.0 pi)))
                        )
                        (if (< aann (* -1.0 pi))
                            (setq aann (+ aann (* 2.0 pi)))
                        )
                        (if (null ang)
                            (setq ang aann)
                            (if (null(eq_angle_pi ang aann))
                                (setq flag t)
                            )
                        )
                    )
                )
                (if (null flag)
                    (progn
                        (setq ptt (points_2_mrs p1 pt p2 ang sc))
                        (if (null p3)
                            (setq p3 ptt)
                        )
                        (if (null(and
                                    (equal p3 ptt 1e-7)
                                    (equal p3 (points_2_mrs p1a pt p2a ang sc) 1e-7)
                                ))
                            (setq flag t)
                            (setq ret (list p3 ang sc))
                        ))
                )
            )
            
            ((or (= nm "LWPOLYLINE")(= nm "POLYLINE"))
                (setq p1s(GETPTS ent)p2s(GETPTS ent2))
                (setq len (length p1s))
                (if (= len (length p2s))
                    (progn
                        (while (> len 0)
                            (setq len (1- len))
                            (if (null(equal p3 (points_2_mrs (nth len p1s) pt (nth len p2s) ang sc) 1e-7))
                                (setq flag t len 0)
                            )
                        )
                        
                        (if (null flag)
                            (setq ret (list p3 ang sc))
                        )
                    )
                )
            )
            ((= nm "ARC")
                (if (equal (- (cdr (assoc 50 ent))(cdr (assoc 51 ent)))(- (cdr (assoc 50 ent2))(cdr (assoc 51 ent2))) 1e-7)
                    (progn
                        
                        (setq sscc (/ (cdr (assoc 40 ent2))(cdr (assoc 40 ent))))
                        (setq r1 (cdr (assoc 40 ent)) r2 (cdr (assoc 40 ent2)))
                        (setq aann (- (cdr (assoc 50 ent2))(cdr (assoc 50 ent))))
                        
                        (if (> aann (* 2.0 pi))
                            (setq aann (- aann (* 2.0 pi)))
                        )
                        (if (< aann (* -1.0 pi))
                            (setq aann (+ aann (* 2.0 pi)))
                        )
                        (if (null ang)
                            (setq ang aann)
                            (if (null(eq_angle ang aann))
                                (setq flag t)
                            )
                        )
                        (if (null flag)
                            (progn
                                (if (null sc)
                                    (setq sc sscc)
                                    (if (null(equal sc sscc 1e-7))
                                        (setq flag t)
                                    )
                                )
                            )
                        )
                        (if (null flag)
                            (progn
                                (setq a1 (cdr (assoc 50 ent))a2(cdr (assoc 50 ent2)))
                                (setq p1a (list (+(car p1) (* r1 (cos a1))) (+(cadr p1) (* r1 (sin a1)))))
                                (setq p2a (list (+(car p2) (* r2 (cos a2))) (+(cadr p2) (* r2 (sin a2)))))
                                (setq ptt (triangle_2_mrs p1 p1a pt p2 p2a))
                                (if (null p3)
                                    (setq p3 ptt)
                                    (if (or(null(equal p3 ptt 1e-7))(null(equal (- a2 a1)ang 1e-7)))
                                        (setq flag t)
                                    )
                                )
                                (if (null flag)
                                    (setq ret (list p3 ang sc))
                                )
                            )
                        )
                        
                    )
                )
            )
            (if (= nm "INSERT")
                (if (and(= (cdr (assoc 2 ent))(cdr (assoc 2 ent2)))
                        (equal (/ (cdr (assoc 42 ent))(cdr (assoc 41 ent)))(/ (cdr (assoc 42 ent2))(cdr (assoc 41 ent2)))  1e-7))
                    (progn
                        (setq a1 (cdr (assoc 50 ent))a2(cdr (assoc 50 ent2)))
                        (setq sscc (/ (cdr (assoc 41 ent2))(cdr (assoc 41 ent))))
                        (if (null sc)
                            (setq sc sscc)
                            (if (null(equal sc sscc 1e-7))
                                (setq flag t)
                            )
                        )
                        (setq aann (- a2 a1))
                        (if (> aann (* 2.0 pi))
                            (setq aann (- aann (* 2.0 pi)))
                        )
                        (if (< aann (* -1.0 pi))
                            (setq aann (+ aann (* 2.0 pi)))
                        )
                        (if (null ang)
                            (setq ang aann)
                            (if (null(eq_angle ang aann))
                                (setq flag t)
                            )
                        )
                        (setq ptt (points_2_mrs p1 pt p2 ang sc))
                        (if (null p3)
                            (setq p3 ptt)
                            (if (null(equal p3 ptt 1e-7))
                                (setq flag t)
                            )
                        )
                        (if (null flag)
                            (setq ret (list p3 ang sc))
                        )
                    )
                )
            )
            (t
                (if(and
                        (equal p3 (points_2_mrs p1 pt p2 ang sc) 1e-7)
                        (eq_dxf ent ent2))
                    (setq ret (list p3 ang sc))
                )
            )
        )
    )
    ret
);;其它图元有待增加完善


评分

参与人数 1明经币 +1 收起 理由
jltx123456 + 1 赞一个!

查看全部评分

发表于 2016-1-6 16:58 | 显示全部楼层
jack093 发表于 2016-1-6 15:26
支持图元增加

(defun find_eq_ent(ent ent2 pt p3 ang sc /  flag ret nm p1 p2 p1a p2a aann sscc ptt  ...

楼主,很好的主题, 但是看到每层都放一点代码,这样会不易阅读 ,建议整理成一个完整的贴出来,或者直接上传lisp附件!
发表于 2019-4-18 10:37 | 显示全部楼层
想不到还可以,破镜重圆,点赞
发表于 2020-9-27 02:38 | 显示全部楼层
老师:加载一楼的插件,使用时提示no function definition: SS_ADD-DEL,怎么解决?
发表于 2020-9-27 08:25 | 显示全部楼层
关注,以备日后学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-23 14:18 , Processed in 0.252484 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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