429014673 发表于 2015-12-22 13:36:11

楼主,还缺函数呀

lcxing 发表于 2015-12-22 15:06:53

支持楼主,好东西

prcstone 发表于 2015-12-24 08:00:07

支持楼主

flowerson 发表于 2015-12-24 11:34:30

这个真是很有意义哦!有能力的支持支持!

jack093 发表于 2015-12-24 16:58:48

找到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不同比例不能匹配)
还剩下其它图元支持了

jack093 发表于 2016-1-6 15:26:41

本帖最后由 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
);;其它图元有待增加完善


jltx123456 发表于 2016-1-6 16:58:22

jack093 发表于 2016-1-6 15:26 static/image/common/back.gif
支持图元增加

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

楼主,很好的主题, 但是看到每层都放一点代码,这样会不易阅读 ,建议整理成一个完整的贴出来,或者直接上传lisp附件!

alexmai 发表于 2019-4-18 10:37:03

想不到还可以,破镜重圆,点赞

开心68602 发表于 2020-9-27 02:38:05

老师:加载一楼的插件,使用时提示no function definition: SS_ADD-DEL,怎么解决?

845245015 发表于 2020-9-27 08:25:12

关注,以备日后学习
页: 1 2 [3] 4
查看完整版本: 恢复被打碎的块