在AutoCAD中用多义线绘制一封闭区域,用以下扩展命令将对应的地形数据文件(.dat)中该区域外(稍加修改可变为区域内)的点删除。后续将改进为只对图面点进行处理。
(defun C:zzQydx (/ ptName ptSign ptE ptN ptH ptCount filename1 filename2)
(princ
"功能:删除指定区域外的点,保留区域内的点。(C)QinDong 2017.05 qindxyz@139.com\n"
)
(setq filename1
(getfiled "提示字符串"
"D:\\"
"dat"
2
)
)
(if filename1
(progn
(setq
filename2 (strcat (car (splitx filename1 ".dat"))
"-区域提取-"
(date)
"-"
(time)
".dat"
)
)
(setq regionObj (entsel))
(setq f1 (open filename1 "r"))
(if (and f1 regionObj)
(progn
(setq f2 (open filename2 "w"))
(setq rIndex 0)
(setq ptCount 0)
(while (setq lineStr (read-line f1))
(setq lineStrs (splitX lineStr ","))
(setq ptName (cons (nth 0 lineStrs) ptName))
;;将点编号或点名生成表
(setq ptE (cons (nth 2 lineStrs) ptE))
;;将E生成表
(setq ptN (cons (nth 3 lineStrs) ptN))
;;将N生成表
(setq ptH (cons (nth 4 lineStrs) ptH))
;;将H生成表
(setq ptSign (cons (itoa rIndex) ptSign))
;;生成记号表
(setq rIndex (+ rIndex 1))
)
(setq ptName (reverse ptName))
;;反序
(setq ptSign (reverse ptSign))
;;反序
(setq ptE (reverse ptE))
;;反序
(setq ptN (reverse ptN))
;;反序
(setq ptH (reverse ptH))
;;反序
(close f1)
;;表处理
(setq rIndex 0)
(while (setq tmpPtname (nth rIndex ptName))
(setq tmpE (nth rIndex ptE))
(setq tmpN (nth rIndex ptN))
(setq tmpH (nth rIndex ptH))
(setq tmpSign (nth rIndex ptSign))
(if (pt_inorout regionObj (list (atof tmpE) (atof tmpN)))
(progn
(write-line
(strcat tmpPtname ",," tmpE "," tmpN "," tmpH)
f2
)
(setq ptCount (+ 1 ptCount))
)
)
(setq rIndex (+ rIndex 1))
)
;;表处理
(princ
(strcat
"共提取"
(itoa ptCount)
"个点。(C)QinDong 2017.05 qindxyz@139.com"
)
)
;;(princ "\n")
(close f2)
)
;;End progn
(princ
"用户取消操作!(C)QinDong 2017.05 qindxyz@139.com"
)
)
;;end if
)
;; end progn1
(princ
"用户取消操作!(C)QinDong 2017.05 qindxyz@139.com"
)
)
;;end if1
(princ)
)
;;;功能:字符串按指定分隔符分隔,分隔符可以是字串,用于取文件名,用扩展名作为分隔符
;;;(splitX "C:\\Users\\....25~K1+013.52;EL.2776.73~EL.2804.74).dat" ".dat")
;;;返回:(C:\\Users\\....25~K1+013.52;EL.2776.73~EL.2804.74))
(defun splitX (str delim / LST POS)
(while (setq pos (vl-string-search delim str))
(setq lst (append lst (list (substr str 1 pos))))
(setq str (substr str (+ (+ pos (strlen delim)) 1)))
)
(if (> (strlen str) 0)
(append lst (list str))
lst
)
)
(defun pt_inorout (regionObj pt / pt_list e1 pt n i j va va_count)
(setq pt_list (mapcar 'cdr
(vl-remove-if
'(lambda (x) (/= 10 (car x)))
(entget (car regionObj))
)
)
)
(setq i 0
va_count 0
n (length pt_list)
pt_list (append pt_list (list (car pt_list)))
)
(repeat n
(setq va (- (angle pt (nth i pt_list))
(angle pt (nth (1+ i) pt_list))
)
)
(cond ((> va pi) (setq va (- va pi)))
((< va (* -1 pi)) (setq va (+ va pi)))
)
(setq va_count (+ va_count va)
i (1+ i)
)
)
(if (< (abs (- (abs va_count) pi)) 0.000001)
't
'nil
)
)
(defun date ()
(setq datetime (rtos (getvar "cdate") 2 6))
(car (splitx datetime "."))
)
(defun time ()
(setq datetime (rtos (getvar "cdate") 2 6))
(cadr (splitx datetime "."))
)
注:本程序对于凹凸复杂的区域可能会判断失败。