树櫴希德 发表于 2024-8-9 11:20:06

悬赏实现多段线描绘效果LISP源码,谢谢

贴上伪源码
;21、绘截描线
(defun c:hjmx ( / catch e1 e2 ent ex fz getfun ls ob ob1 obs okp p1 p2 pLst pn poly ps psx ss tp tps)
(defun getfun ()
    (if p1
      (progn (initget "C H U") (setq p2 (getpoint "\n指定下一个点[闭合(C)/描边与直线切换(H)/放弃(U)]<退出>:" p1)))
      (progn (initget "S") (setq p1 (getpoint (strcat "\n请指定'绘截描线'的起点[设置(S)]<退出>:"))))
    )
    (setq psx (list p1 p2) p1 (car psx) p2 (cadr psx))
)
; 主程序
(setq tps '("LWPOLYLINE" "CIRCLE" "ARC" "ELLIPSE") fz 0.03 p1 nil p2 nil e1 nil e2 nil
      ps nil pLst nil ob nil obs nil okp t poly nil ; pLst为'((p1 p2 e1 e2 ob) ...)
)
(while (and okp (setq catch (vl-catch-all-apply 'getfun nil)))
    (if (and catch (not (vl-catch-all-error-p catch)))
      (progn
      (if (and p2 (listp p2) p1(< (distance p1 p2) fz))(progn (setq p2 nil) (princ "\n距离太近,无效点!")))
      (cond
          ((and p1 (listp p1) (not p2))
            (if (and (setq ent (nentselp p1)) (setq e1 (car ent) tp (En-GetProp* e1 0)) (vl-position tp tps))
            (setq p1 (cadr ent) ex (sssetfirst nil (Data-ToSs* e1))) ; (nentselp (getpoint))
            (setq e1 nil)
            )
            (setq ps (cons p1 ps) pLst (cons (list p1 p2 e1 e2 ob) pLst))
          )
          ((and p2 (listp p2) p1)
            (if (and (setq ent (nentselp p2)) (setq e2 (car ent) tp (En-GetProp* e2 0)) (vl-position tp tps))
            (progn
                (sssetfirst nil nil) ; 清除之前的选择
                (setq p2 (cadr ent) ex (sssetfirst nil (Data-ToSs* e2))) ; (nentselp (getpoint))
                (if (and e1 (equal e1 e2))
                  (setq ob (Curve-PartCopy* e1 p1 p2)) ; 在同一条曲线上 要描边
                  (setq ob (vlax-Invoke *Model* "AddLine" p1 p2)) ; 绘制直线
                )
            ) ; (getpoint p1) (getpoint p2)(Else-TestPts* ps) (length ps) (length pLst) (setq ps nil)
            (setq e2 nil ob (vlax-Invoke *Model* "AddLine" p1 p2)) ; 绘制直线
            )
            (setq ps (cons p2 ps) obs (cons ob obs) pLst (cons (list p1 p2 e1 e2 ob) pLst) p1 p2 e1 e2)
;            (if (> n 1) (setq sso (cadr (ssgetfirst)))) ; 获取并保留之前的选择
;            (sssetfirst nil nil) ; 清除之前的选择
;            (sssetfirst nil (Ss-Union* sso ss)) ; 夹点显示
          )
          ((= p1 "S") ; 只能最开始设置一次
            (princ "\n暂未添加设置信息,后续增加,谢谢!")
            (princ)
          )
      )
      (cond
          ((and (> (length obs) 1) (= p2 "C")) ; 闭合并退出 并 校对悬挂点
            (setq okp nil ss (cadr (ssgetfirst))) ; (sssetfirst nil ss) (sslength ss)
;            (setq poly (car (Poly-Joina* obs t t nil nil nil))) ; (Poly-Joina* enobss polyp delp lay litp c)
            (setq poly (Cmd-JionToPoly* (Data-ToSs* obs) fz))
            (Ob-MdfProp* poly "Closed" -1)
;            (sssetfirst nil nil) ; 清除之前的选择
          )
          ((and e1 (equal e1 e2) (= p2 "H")) ; 切换
            (setq ls (car pLst) p1 (car ls) p2 (cadr ls) ob (nth 4 ls)) ; (getpoint p1) (getpoint p2)
            (if (= (vlax-Get ob "ObjectName") "AcDbLine")
            (setq ob1 (Curve-PartCopy* e1 p1 p2)) ; 在同一条曲线上 要描边
            (setq ob1 (vlax-Invoke *Model* "AddLine" p1 p2)) ; 绘制直线
            )
            (vlax-Invoke ob "Delete") ; 删除当前线
            (setq ob ob1 obs (cdr obs) obs (cons ob obs) pLst (cdr pLst) pLst (cons (list p1 p2 e1 e2 ob) pLst) p1 p2)
          )
          ((and p1 p2 ps pn (= p2 "U")) ; 撤销
            (setq ls (car pLst) p1 (car ls) p2 (cadr ls) e1 (caddr ls) e2 (nth 3 ls) ob (nth 4 ls))
          )
      )
      )
    )
)
(if (and (not poly) (> (length obs) 1))
    (setq poly (Cmd-JionToPoly* (Data-ToSs* obs) fz)) ; (setq poly (car (Poly-Joinv* obs t t nil nil nil)))
)
(setq ex (sssetfirst nil nil) getfun nil) ; 清除之前的选择,清除子函数
(princ "\n'绘截描线'完毕,感谢使用!")
(princ)
)

p-3-ianlcc 发表于 2024-8-9 12:57:54

这个不错,希望有大佬能够修正分享!
占个位子…期待

wline 发表于 2024-8-9 13:46:16

这个厉害了,坐等哪位大佬出手
页: [1]
查看完整版本: 悬赏实现多段线描绘效果LISP源码,谢谢