明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2295|回复: 5

如何在选择集上再建选择集?

[复制链接]
发表于 2004-11-14 09:13:00 | 显示全部楼层 |阅读模式
一般来说,选择集操作函数是过滤所有的图元,以便找出需要的实体。如果一个图形很大(通常是几十兆),若每一次都要过滤所有的图元,就会耗费大量的时间,几乎不能容忍,那么能不能先过滤一次,建立一个选择集,下一次过滤时在第一个选择集的基础上建一个新的选择集,而不是扫描所有的图元,能做到吗?怎么做?
发表于 2004-11-15 11:00:00 | 显示全部楼层
直接使用SSGET的过滤表就可以选到你需要的东西,而不会选择整个图形
发表于 2004-11-15 11:43:00 | 显示全部楼层
用ssadd
 楼主| 发表于 2004-11-15 14:04:00 | 显示全部楼层
为便于将问题说明清楚,现在赋上程序源码,请各位指点,因为这段程序在几十兆的电子地形中使用时,速度极慢,不知怎样解决才好。(不知道怎么贴文件,直接贴于此) ;;;filename: LayerList.DCL
layerlist:dialog{
label="图层显示和选择";
:boxed_column{
label="选择需要的图层(按ctrl键多选)";
:list_box{
label="图层列表";
key="alllayer";
multiple_select=true;
}
}
:edit_box{
label="里程冠号";
key="editgh";
}
:edit_box{
label="扫描半径";
key="editr";
}
ok_only;
} ;;;自动读取纵横断面,相应对话框文件 layerlist.dcl 修改时间2004-06.
(defun c:zddm ()
;;;读出所有图层名称
(setvar "cmdecho" 0)
(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)
(setq tcbiao (list))
(setq tcbiao_1 (tblnext "LAYER" T))
(setq tcname (cdr (assoc '2 tcbiao_1)))
(setq tcbiao (cons tcname tcbiao))
(while (setq tcbiao_1 (tblnext "LAYER"))
(setq tcname (cdr (assoc '2 tcbiao_1)))
(setq tcbiao (cons tcname tcbiao))
)
(setq tcbiao (reverse tcbiao))
(tblnext "LAYER" T) (setq r "50.0")
(setq ghh "K") (setq dcl_id (load_dialog "layerlist.dcl"))
(if (not (new_dialog "layerlist" dcl_id))
(exit)
) (start_list "alllayer")
(mapcar 'add_list tcbiao)
(end_list) (setq i 0
n (length tcbiao)
theval ""
)
(repeat n
(setq ysxng (nth i tcbiao))
(if (or (= "A80" ysxng) (= "A82" ysxng))
(setq theval (strcat theval (rtos i 2 0) " "))
)
(setq i (1+ i))
) (set_tile "alllayer" theval)
(set_tile "editgh" ghh)
(set_tile "editr" r)
(action_tile "alllayer" "(setq thetc $value)")
(action_tile "editgh" "(setq ghh $value)")
(action_tile "editr" "(setq r $value)") (if (= (start_dialog) 0)
(progn (unload_dialog dcl_id)
(exit)
)
(unload_dialog dcl_id)
)
(if (not thetc) (exit))
(setq b4ln (read (strcat "(" thetc ")")))
(setq n (length b4ln)
laystr ""
i 0
)
(repeat n
(setq thestr (nth (nth i b4ln) tcbiao))
(if (= i 0)
(setq laystr (strcat laystr thestr))
(setq laystr (strcat laystr "," thestr))
)
(setq i (1+ i))
)
(setq firstp (getpoint "\n纵面第一点:"))
(setq secondp (getpoint firstp "\n纵面方向点:"))
(command "line" firstp secondp "")
(setq startm (getreal "\n纵面第一点相应里程:"))
(setq msg (strcat "\n第一个 横 断面里程:"))
(setq theplace (getreal msg))
(setq distofsec (getreal "\n横断面间距:"))
(setq secwid (getreal "\n横断面宽度(5的倍数,为0时生成纵面数据):"))
(setq numofsec (getint "\n横断面个数:"))
(setq sdck (getstring "\n是隧道出口吗(y or n)?<默认 n>:"))
(if (= sdck nil)
(setq sdck "n")
)
(setq repeatnum (fix (/ secwid 5.0)))
(setq firstangle (angle firstp secondp))
(setq secondangle1 (+ firstangle 1.57))
(if (>= secondangle1 6.2832)
(setq secondangle1 (- secondangle1 6.2832))
)
(setq secondangle2 (+ secondangle1 3.14))
(if (>= secondangle2 6.2832)
(setq secondangle2 (- secondangle2 6.2832))
)
(if (= (strcase sdck) "Y")
(progn
(setq thirdangle secondangle1)
(setq secondangle1 secondangle2)
(setq secondangle2 thirdangle)
)
)
(setq distofp 5)
(setq n 0
hofcenter 0.0
) (setq mm 1) (setq fname (getfiled "断面数据保存位置" "" "txt" 5))
(setq f (open fname "w"))
(repeat numofsec (grtext -1
(strcat "第" (rtos mm 2 0) "个断面中桩高程")
) (setq placen (+ theplace (* n distofsec)))
(setq
tmpstr1 (strcat
"\""
ghh
(rtos (fix (/ placen 1000)) 2 0)
"+"
(rtos (- placen (* (fix (/ placen 1000)) 1000.0)) 2 2)
"\""
)
)
(setq tmpstr2 (rtos placen))
(if (/= repeatnum 0)
(setq string1 tmpstr1)
(setq string1 tmpstr2)
)
(setq L1 (- placen startm))
(setq centerplace (polar firstp firstangle L1))
(command "circle" centerplace 0.5)
(setq hofcenter (findh centerplace))
(setq string1 (strcat string1 "\t" (rtos hofcenter 2 2)))
(write-line string1 f)
(if (/= repeatnum 0)
(progn
(setq i 1)
(setq string2 "")
(repeat repeatnum (grtext -1
(strcat "第"
(rtos mm 2 0)
"个断面左"
(rtos i 2 0)
"点高程"
)
) (setq secplacen (* i distofp))
(setq secpoint (polar centerplace secondangle1 secplacen))
(command "circle" secpoint 0.5)
(setq hofsecpoint (findh secpoint))
(setq string2 (strcat string2
(rtos secplacen 2 2)
"\t"
(rtos (- hofsecpoint hofcenter) 2 2)
"\t"
)
)
(setq i (1+ i))
)
(write-line string2 f) (setq i 1)
(setq string3 "")
(repeat repeatnum (grtext -1
(strcat "第"
(rtos mm 2 0)
"个断面右"
(rtos i 2 0)
"点高程"
)
) (setq secplacen (* i distofp))
(setq secpoint (polar centerplace secondangle2 secplacen))
(command "circle" secpoint 0.5) (setq hofsecpoint (findh secpoint))
(setq string3 (strcat string3
(rtos secplacen 2 2)
"\t"
(rtos (- hofsecpoint hofcenter) 2 2)
"\t"
)
)
(setq i (1+ i))
)
(write-line string3 f)
)
)
(setq mm (1+ mm)
n (1+ n)
)
) (grtext -1 "") (close f) (alert "读点完成,对照原图核实其高程。图上的临时圆点及直线便于核实参照,请手动删除!")
(setvar "osmode" oldosmode)
(princ)
) (defun findh (pt) ;;;此处判读高程
(setq ss1 (ssadd))
(setq ss2 (ssadd))
(setq ss3 (ssadd))
(setq ss4 (ssadd)) (setq angle1 (* 3.14 0.0))
(setq angle2 (+ 3.14 angle1))
(setq angle3 (* 3.14 0.5))
(setq angle4 (+ 3.14 angle3)) (setq step1 0.45
step2 0.4
) (setq hofpt 0)
(setq distofangle1 0
distofangle2 0
distofangle3 0
distofangle4 0
) (setq filtlist (list (cons '8 laystr))) ;;;Find ss1 and ss2
(setq ssn nil)
(setq distfrompt 0)
(while (and (= (sslength ss1) 0) (<= distfrompt (read r)))
(setq ptn_1 (polar pt angle1 distfrompt))
(setq ptn_2 (list (+ (car ptn_1) step1) (+ (cadr ptn_1) step1)))
(setq ssn (ssget "_c" ptn_1 ptn_2 filtlist))
(if ssn
(progn
(if (/= (sslength ssn) 0)
(progn
(setq e1 (ssname ssn 0))
(ssadd e1 ss1)
)
)
)
)
(setq distofangle1 distfrompt)
(setq distfrompt (+ distfrompt step2))
) (setq ssn nil)
(setq distfrompt 0)
(while (and (= (sslength ss2) 0) (<= distfrompt (read r)))
(setq ptn_1 (polar pt angle2 distfrompt))
(setq ptn_2 (list (- (car ptn_1) step1) (- (cadr ptn_1) step1)))
(setq ssn (ssget "_c" ptn_1 ptn_2 filtlist))
(if ssn
(progn
(if (/= (sslength ssn) 0)
(progn
(setq e1 (ssname ssn 0))
(ssadd e1 ss2)
)
)
)
)
(setq distofangle2 distfrompt)
(setq distfrompt (+ distfrompt step2))
)
(setq dist1 (+ distofangle1 distofangle2)) ;;;Find ss3 and ss4
(setq ssn nil)
(setq distfrompt 0)
(while (and (= (sslength ss3) 0) (<= distfrompt (read r)))
(setq ptn_1 (polar pt angle3 distfrompt))
(setq ptn_2 (list (+ (car ptn_1) step1) (+ (cadr ptn_1) step1)))
(setq ssn (ssget "_c" ptn_1 ptn_2 filtlist))
(if ssn
(progn
(if (/= (sslength ssn) 0)
(progn
(setq e1 (ssname ssn 0))
(ssadd e1 ss3)
)
)
)
)
(setq distofangle3 distfrompt)
(setq distfrompt (+ distfrompt step2))
) (setq ssn nil)
(setq distfrompt 0)
(while (and (= (sslength ss4) 0) (<= distfrompt (read r)))
(setq ptn_1 (polar pt angle4 distfrompt))
(setq ptn_2 (list (- (car ptn_1) step1) (- (cadr ptn_1) step1)))
(setq ssn (ssget "_c" ptn_1 ptn_2 filtlist))
(if ssn
(progn
(if (/= (sslength ssn) 0)
(progn
(setq e1 (ssname ssn 0))
(ssadd e1 ss4)
)
)
)
)
(setq distofangle4 distfrompt)
(setq distfrompt (+ distfrompt step2))
)
(setq dist2 (+ distofangle3 distofangle4)) (if (and (<= dist1 dist2)
(/= (sslength ss1) 0)
(/= (sslength ss2) 0)
)
(progn
(setq e1 (ssname ss1 0))
(setq ent1 (entget e1))
(setq hhh (cdr (assoc 10 ent1)))
(if (not (caddr hhh))
(progn
(setq hhh (cdr (assoc 38 ent1)))
(setq hh1 hhh)
)
(setq hh1 (caddr hhh))
)
(setq e2 (ssname ss2 0))
(setq ent2 (entget e2))
(setq hhh (cdr (assoc 10 ent2)))
(if (not (caddr hhh))
(progn
(setq hhh (cdr (assoc 38 ent2)))
(setq hh2 hhh)
)
(setq hh2 (caddr hhh))
)
(if (= dist1 0)
(setq dist1 (* 2 (read r)))
)
(setq hofpt (+ hh1 (* (- hh2 hh1) (/ distofangle1 dist1))))
)
) (if (and (<= dist2 dist1)
(/= (sslength ss3) 0)
(/= (sslength ss4) 0)
)
(progn
(setq e1 (ssname ss3 0))
(setq ent1 (entget e1))
(setq hhh (cdr (assoc 10 ent1)))
(if (not (caddr hhh))
(progn
(setq hhh (cdr (assoc 38 ent1)))
(setq hh1 hhh)
)
(setq hh1 (caddr hhh))
)
(setq e2 (ssname ss4 0))
(setq ent2 (entget e2))
(setq hhh (cdr (assoc 10 ent2)))
(if (not (caddr hhh))
(progn
(setq hhh (cdr (assoc 38 ent2)))
(setq hh2 hhh)
)
(setq hh2 (caddr hhh))
)
(if (= dist2 0)
(setq dist2 (* 2 (read r)))
)
(setq hofpt (+ hh1 (* (- hh2 hh1) (/ distofangle3 dist2))))
)
)
(princ "\t")
(princ hofpt) )
发表于 2004-11-15 17:00:00 | 显示全部楼层
晕,谁有耐心看完.
发表于 2004-11-20 18:35:00 | 显示全部楼层
旧有选择集ss_old


新创建的选择集ss_new


(command "select" ss_old "")


(setq ss_new (ssget "p" '((0 . "TEXT")))) ;ss_old中的TEXT


OK?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-30 04:26 , Processed in 0.168603 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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