明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1509|回复: 1

lisp中关于使用 ssget 函数遇到的难题,待大家帮我解决

[复制链接]
发表于 2009-6-5 23:44:00 | 显示全部楼层 |阅读模式

下面是代码:

 ;            检查    房屋层次注记,性质注记与房屋边线是否匹配
(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就会出错,如何解决呢?请大家多多出主意......

发表于 2009-6-6 12:16:00 | 显示全部楼层
1、用(ssget "c" p-2 p-1 ……)时图形一定要显示在屏幕上;
可以先(command "zoom" "w" p-2 p-1),选择后再(command "zoom" "p")。
2、为防止误选应关闭特征点捕捉(setvar "OSMODE" 0)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-24 23:19 , Processed in 0.178964 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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