马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 /db_自贡黄明儒_ 于 2014-11-15 16:25 编辑
 - ;;[功能] 将排序进行到低(也适合倾斜对象)
- ;;MinAreaRectangle Graham-scan 见http://bbs.mjtd.com/thread-81308-1-1.html By highflybir
- ;;ssPts: 1 选择集,返回图元列表
- ;; 2 点表(1到n维 1维时key只能是x或X),返回点表
- ;; 3 图元列表,返回图元列表
- ;; 4 字符列表或者数值列表
- ;;Key: "xyzXYZ"任意组合,例如"yX",y在前表示y坐标优先,小y表示从小到大(注:二维点时,不能有z)
- ;;FUZZ: 允许误差
- ;;注:点表可以1到n维混合,Key长度不大于点的最小维数。
- ;;示例1 (HH:SortEndByPt (ssget) "YxZ" 0.5);返回(<Entity name: 7ef7b3a8> <Entity name: 7ef7b3a0>)
- ;;示例2 (HH:SortEndByPt (list '(2 3) '(2 4) '(3 5)) "Yx" 0.5);返回((3 5) (2 4) (2 3))
- ;;示例3 (HH:SortEndByPt '(<Entity name: 7ef79a28> <Entity name: 7ef79a10>) "YxZ" 0.5)
- ;;示例4 (HH:SortEndByPt (list "DF" "ZX" "A" "DD" "A") "X" 1)=>("ZX" "DF" "DD" "A" "A")
- ;;示例5 (HH:SortEndByPt (list 5 8 5.0 9 5) "X" 1)=>(9 8 5 5.0 5)
- ;;自贡黄明儒 2014年11月15日
- (defun HH:SortEndByPt (ssPts KEY FUZZ / AN FUN LST P P1 P2 PB PT PTS SSPTS)
- ;;1 点列表排序
- (defun sortpts (PTS FUN xyz FUZZ)
- (vl-sort pts
- '(lambda (a b)
- (if (not (equal (xyz a) (xyz b) fuzz))
- (fun (xyz a) (xyz b))
- )
- )
- )
- )
- ;;2 排序先后
- (defun sortpts1 (PTS KEY FUZZ)
- (foreach xyz (reverse (vl-string->list Key))
- (cond ((< xyz 100)
- (setq fun >)
- (setq xyz (nth (- xyz 88) (list car cadr caddr)))
- )
- (T
- (setq fun <)
- (setq xyz (nth (- xyz 120) (list car cadr caddr)))
- )
- )
- (setq Pts (sortpts Pts fun xyz fuzz))
- )
- )
- ;;3 [功能] 点表旋转
- (defun HH:Sort-rotate (pts pb an / P PT)
- (mapcar '(lambda (p)
- (setq pt (list (car p) (cadr p)))
- (setq pt (polar pb (+ (angle pt pb) an) (distance pt pb)))
- (list (car pt) (cadr pt) (caddr p) (cadddr p))
- )
- pts
- )
- )
- ;;4 [功能] 排序用选择集(图元列表)取点函数
- (defun HH:SortEndByPt-SS (ss / E EN GRAH N P SORT)
- (cond
- ((= (type ssPts) 'PICKSET)
- (repeat (setq n (sslength ss))
- (setq e (ssname ss (setq n (1- n))))
- (setq en (entget e))
- (cond ((wcmatch (cdr (assoc 0 en)) "POINT,ARC,CIRCLE,ELLIPSE")
- (setq p (cdr (assoc 10 en)))
- )
- (T (setq p (MiddleCenPoint e)))
- )
- (setq Sort (cons (append p (list e)) Sort)) ;排序
- (setq Grah (cons p Grah)) ;扫描
- )
- )
- (T
- (foreach n ss
- (setq en (entget n))
- (cond ((wcmatch (cdr (assoc 0 en)) "POINT,ARC,CIRCLE,ELLIPSE")
- (setq p (cdr (assoc 10 en)))
- )
- (T (setq p (MiddleCenPoint n)))
- )
- (setq Sort (cons (append p (list n)) Sort)) ;排序
- (setq Grah (cons p Grah)) ;扫描
- )
- )
- )
- (list Grah Sort)
- )
- ;;5 本程序主程序
- (cond
- ((or (= (type ssPts) 'PICKSET)
- (and (Listp ssPts) (= (type (car ssPts)) 'ENAME))
- )
- (setq pts (HH:SortEndByPt-SS ssPts))
- (setq lst (cadr pts))
- (setq pts (car pts))
- (setq pts (car (MinAreaRectangle (Graham-scan pts)))) ;4点
- ;;如果前2点(最下2点)Y坐标误差>fuzz,则旋转对象
- (setq p1 (car pts))
- (setq p2 (cadddr pts))
- (cond ((> (abs (- (cadr p1) (cadr p2))) FUZZ)
- (setq lst (HH:Sort-rotate lst p1 (- (angle p1 p2))))
- )
- )
- (mapcar 'cadddr (sortpts1 lst KEY FUZZ))
- )
- ((Listp ssPts)
- (cond
- ;;是否为点
- ((and (vl-consp (car ssPts))
- (null (vl-catch-all-error-p (vl-catch-all-apply 'vlax-3d-point (car ssPts))))
- )
- (setq pts (car (MinAreaRectangle (Graham-scan ssPts)))) ;4点
- (setq p1 (car pts))
- (setq p2 (cadr pts))
- (cond ((equal (abs (- (cadr p1) (cadr p2))) FUZZ)
- (setq lst (HH:Sort-rotate ssPts p1 (angle p1 p2)))
- )
- (T (setq lst ssPts))
- )
- (sortpts1 lst KEY FUZZ)
- )
- (T
- (cond ((wcmatch key "X,Y,Z") (vl-sort ssPts '>))
- ((wcmatch key "x,y,z") (vl-sort ssPts '<))
- )
- )
- )
- )
- )
- )
- ;;功能:获取对象正中点
- (defun MiddleCenPoint (e / P1 P2 PLIST X)
- (cond ((= (type e) 'ename) (setq e (vlax-ename->vla-object e))))
- (vla-getboundingbox e 'p1 'p2)
- (setq p1 (vlax-safearray->list p1))
- (setq p2 (vlax-safearray->list p2))
- (mapcar '(lambda (X Y) (* (+ X Y) 0.5)) P1 P2)
- )
|