下面是代码: ; 检查 房屋层次注记,性质注记与房屋边线是否匹配 (defun zzh-lyjc-jmd-zj (/ j k sm dx dx-ty dx-x dx-y dx-xy dx-zjlr kkkkk p-2 p-1 j-2 fw fw-ty fw-bm fw-cc fw-cc-dx fw-xy j1 dd1 ) (command "_setvar" "pickstyle" 0) ; (1) 取消编组 (setq j (ssget "x" '((-4 . "<and")(0 . "TEXT")(8 . "JMD")(-4 . "and>")))) (setq k 0 sm (sslength j)) (while (< k sm) (setq dx (ssname j k)) (setq dx-ty (entget dx'("*"))) (setq dx-x (nth 1 (assoc 10 dx-ty)) dx-y (nth 2 (assoc 10 dx-ty))) ;dx-x和dx-y是一点的坐标 (setq dx-xy (list dx-x dx-y)) ;注记坐标xy (setq dx-zjlr (cdr (assoc 1 dx-ty))) ;注记内容 (setq kkkkk 1.6) (setq p-2 (list (+ dx-x 1.6) (+ dx-y 1.6))) (setq p-1 (list (- dx-x 0.6) (- dx-y 0.6))) (while (= (ssget "c" p-2 p-1 ' ((0 . "LWPOLYLINE") (6 . "Continuous")(8 . "JMD"))) nil) (setq p-2 (list (+ dx-x kkkkk) (+ dx-y kkkkk))) (setq p-1 (list (- dx-x kkkkk) (- dx-y kkkkk))) (setq j-2 (ssget "c" p-2 p-1 ' ((0 . "LWPOLYLINE") (6 . "Continuous")(8 . "JMD")))) (setq kkkkk (+ kkkkk 0.2))) ; 搜索系数 kkkkk 每次加大 0.2 直至搜索到房屋 (if j-2 (progn (if (= (sslength j-2) 1) ; 搜索到的房屋数目为 1 (progn (setq fw (ssname j-2 0)) (setq fw-ty (entget fw'("*"))) (setq fw-bm (cdr (cadadr (assoc -3 fw-ty)))) ; 房屋性质 (if (= (strlen dx-zjlr) 2) ;如果(= (strlen dx-zjlr) 2) 则房屋是 1层 (progn (if (or ;141101为一般房屋 (and (= dx-zjlr "砖") (/= fw-bm "141121")(/= fw-bm "141101")) ; 1. 如果不是砖房则 错 (and (= dx-zjlr "混") (/= fw-bm "141161")(/= fw-bm "141101")) ; 1. 如果不是混房则 错 (and (= dx-zjlr "砼") (/= fw-bm "141111")(/= fw-bm "141101")) ; 1. 如果不是砼房则 错 (and (= dx-zjlr "木") (/= fw-bm "141151")(/= fw-bm "141101")) ; 1. 如果不是木房则 错 (and (= dx-zjlr "破") (/= fw-bm "141400")(/= fw-bm "141101")) ; 1. 如果不是破房则 错 (and (= dx-zjlr "钢") (/= fw-bm "141141")(/= fw-bm "141101")) ; 1. 如果不是钢房则 错 (and (= dx-zjlr "铁") (/= fw-bm "141131")(/= fw-bm "141101"))) ; 1. 如果不是铁房则 错 (insert-zzh-lyjc-zj) ) (if (or (= dx-zjlr "10")(= dx-zjlr "11")(= dx-zjlr "12")(= dx-zjlr "13")(= dx-zjlr "14") (= dx-zjlr "15")(= dx-zjlr "16")(= dx-zjlr "17")(= dx-zjlr "18")(= dx-zjlr "19") (= dx-zjlr "20")(= dx-zjlr "21")(= dx-zjlr "22")(= dx-zjlr "23")(= dx-zjlr "24") (= dx-zjlr "25")(= dx-zjlr "26")(= dx-zjlr "27")(= dx-zjlr "28")(= dx-zjlr "29") (= dx-zjlr "30")(= dx-zjlr "31")(= dx-zjlr "32")(= dx-zjlr "33")(= dx-zjlr "34") (= dx-zjlr "35")(= dx-zjlr "36")(= dx-zjlr "37")(= dx-zjlr "38") ) ; 38 层以内 (progn (setq fw-cc (substr dx-zjlr 1 2)) (setq fw-cc-dx (rtos (cdar (cddadr (assoc -3 fw-ty))) 2 0)) (if (/= fw-cc fw-cc-dx) (insert-zzh-lyjc-zj)) )) )) (if (> (strlen dx-zjlr) 2) ;如果(> (strlen dx-zjlr) 2) 则房屋是 2层or2层以上 (progn (setq dx-zjlr (substr dx-zjlr 1 2)) (if (or ;141101为一般房屋 (and (= dx-zjlr "砖") (/= fw-bm "141121")(/= fw-bm "141101")) ; 1. 如果不是砖房则 错 (and (= dx-zjlr "混") (/= fw-bm "141161")(/= fw-bm "141101")) ; 1. 如果不是混房则 错 (and (= dx-zjlr "砼") (/= fw-bm "141111")(/= fw-bm "141101")) ; 1. 如果不是砼房则 错 (and (= dx-zjlr "木") (/= fw-bm "141151")(/= fw-bm "141101")) ; 1. 如果不是木房则 错 (and (= dx-zjlr "破") (/= fw-bm "141400")(/= fw-bm "141101")) ; 1. 如果不是破房则 错 (and (= dx-zjlr "钢") (/= fw-bm "141141")(/= fw-bm "141101")) ; 1. 如果不是钢房则 错 (and (= dx-zjlr "铁") (/= fw-bm "141131")(/= fw-bm "141101"))) ; 1. 如果不是铁房则 错 (insert-zzh-lyjc-zj) )
(setq fw-cc (substr dx-zjlr 3 10)) ; 房屋层次 (setq fw-cc-dx (rtos (cdar (cddadr (assoc -3 fw-ty))) 2 0)) (if (/= fw-cc fw-cc-dx) (insert-zzh-lyjc-zj)) )) ; 2. 如果房屋注记层次和房屋边线编码上的层次不同则 错 (if (= (strlen dx-zjlr) 1) ;如果(= (strlen dx-zjlr) 1) 则一定是房屋层次注记 (progn (setq fw-cc (substr dx-zjlr 1 1)) (setq fw-cc-dx (rtos (cdar (cddadr (assoc -3 fw-ty))) 2 0)) (if (/= fw-cc fw-cc-dx) (insert-zzh-lyjc-zj)) )) )) )) (setq k (+ k 1)) ) (princ) ) (defun insert-zzh-lyjc-zj () ; ZZH-LYJC-JMD-ZJ 的子程序 (setq fw-xy (list (nth 1 (assoc 10 fw-ty)) (nth 2 (assoc 10 fw-ty)))) (command "pline" dx-xy fw-xy "") (setq j1 (/(atof (rtos (sqrt (+ (* (- (car dx-xy) (car fw-xy)) (- (car dx-xy) (car fw-xy))) (* (- (cadr dx-xy) (cadr fw-xy)) (- (cadr dx-xy) (cadr fw-xy))))) 2 3)) 2)) (setq dd1 (polar dx-xy (angle dx-xy fw-xy) j1)) (command "-insert" "zzh-lyjc-zj" dd1 "" "" "") ) 我们公司是使用广州cass7.1绘制的地籍图,以上小程序是为了检查房屋层次注记,性质注记与房屋边线是否匹配 当视口很小时(or 图形很小时)运行正确,当视口很大时(or 图形很大时)运行出错, 因为我对 '视口' 理解不全,可能说得不是很清楚, 简单说就是当图形很大时ssget就会出错,如何解决呢?请大家多多出主意...... |