fishnono 发表于 2006-5-25 11:23:00

请教关于选择集的问题

<P>(setq ss (ssget))<BR>(command "_region" ss "")<BR>请问接下来如何得到这个面域的选择集</P>
<P><BR>还有另外定义多段线的方法:<BR>(setq pt (getpoint))<BR>(command "-boundary" pt "")<BR>接下来要得到包含若干多段线的选择集</P>
<P>谢谢</P>

lazybug 发表于 2006-5-25 16:15:00

本帖最后由 作者 于 2006-5-25 21:28:58 编辑 <br /><br /> (setq ss (ssget "x" '((0 . "REGION"))))<BR>(command "_region" ss "")<BR>(setq ss2 (ssget "x" '((0 . "REGION"))))<BR>(setq n -1)<BR>(setq ss1 '())<BR>(repeat (sslength ss)<BR>&nbsp;&nbsp;&nbsp;&nbsp; (setq en (ssname ss (setq n (1+ n))))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (if (not (ssmemb en ss))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss1 (ssadd en ss1))<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>)<BR>

fishnono 发表于 2006-5-25 16:45:00

<P>回楼上:谢谢指教</P>
<P>不过我要得到的是选择集是面域以后的“面域”</P>
<P>这几句就足够了:(setq ss (ssget))<BR>(command "_region" ss "")<BR>(setq ss2 (ssget "x" '((0 . "REGION"))))</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>另外:如果我要在同一模型空间多次执行这个程序,那么每次得到的选择集就会是模型空间中所有面域,而我只想要本次程序执行中生成的面域。</P>
<P>原因就在这一句:(setq ss2 (ssget "x" '((0 . "REGION"))))</P>
<P>请教如何解决</P>
<P>谢谢</P>

f5612140 发表于 2006-5-25 18:09:00

(ssget "l")

lazybug 发表于 2006-5-25 21:28:00

fishnono发表于2006-5-25 16:45:00static/image/common/back.gif
另外:如果我要在同一模型空间多次执行这个程序,那么每次得到的选择集就会是模型空间中所有面域,而我只想要本次程序执行中生成的面域。

<BR>2楼那个,ss1就是你要的了

fishnono 发表于 2006-5-26 10:38:00

<P>回四楼:SSGET“L”得到的只是一个面域,若一次面域多于两个,不知如何得到?</P>
<P>回五楼:(if (not (ssmemb en ss))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss1 (ssadd en ss1))<BR>&nbsp;&nbsp;&nbsp;&nbsp; )</P>
<P>这句提示参数错误,我找不出来为什么</P>
<P>另外:我做的是排料图,面域成百上千,势必SS SS2都要过界,是否有中类似四楼的方法选择?</P>
<P>原程序在下面:</P>

fishnono 发表于 2006-5-26 10:40:00

<P>(defun c:dpxq (/ thick ss1 ss2 ss no pt sumlen n 1_area tot_area max_area en danpin_area zhiliang)<BR>&nbsp; <BR>&nbsp; (prompt "选择单品外轮廓线(必须闭合)")<BR>&nbsp; (setq ss1 (ssget))<BR>&nbsp; <BR>&nbsp; (setq ss (ssget "x" '((0 . "REGION"))))<BR>&nbsp; (command "_region" ss1 "")<BR>&nbsp; (setq ss2 (ssget "x" '((0 . "REGION"))))<BR>&nbsp; (setq n -1)<BR>&nbsp; (setq no (sslength ss2))<BR>&nbsp; </P>
<P>&nbsp; (repeat no<BR>&nbsp;&nbsp;&nbsp;&nbsp; (setq n (1+ n))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (setq en (ssname ss2 n))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (if (not (ssmemb en ss))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss1 (ssadd en ss1))<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>)<BR>&nbsp; <BR>&nbsp; <BR>&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq n 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq tot_area 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq max_area 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq sumlen 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq en (ssname ss1 n))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while en<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "._area" "_O" en)<BR>&nbsp;(setq sumlen (+ sumlen (getvar "Perimeter")))<BR>&nbsp;(setq 1_area (getvar "area"))<BR>&nbsp;(if (&gt; 1_area max_area) (setq max_area 1_area))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq tot_area (+ tot_area 1_area))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq n (1+ n))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq en (ssname ss n))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp; (setq thick 19)<BR>&nbsp; (setq danpin_area (- (* 2 max_area) tot_area))<BR>&nbsp; (setq zhiliang (* (/ (* danpin_area thick) 1000000000) 7850))</P>
<P>&nbsp; (print "单品线长度")<BR>&nbsp; (princ sumlen)<BR>&nbsp; (print "单品净重:")<BR>&nbsp; (princ zhiliang)<BR>&nbsp; (princ)<BR>&nbsp; )</P>

xxsheng 发表于 2006-5-26 11:21:00

fishnono发表于2006-5-26 10:38:00static/image/common/back.gif
回五楼:(if (not (ssmemb en ss))&amp;nbs...


<P>错误在于ss选择集可能是空的,增加个判断先,如果ss为nil,则直接为ss2,否则从ss2删除ss选择集合------</P>
<P>(setq ss (ssget "x" '((0 . "REGION"))))<BR>&nbsp; (command "_region" ss1 "")<BR>&nbsp; (setq ss2 (ssget "x" '((0 . "REGION"))))</P>
<P>(setq n -1)</P>
<P>(while (and ss (&lt;(setq n(1+ n))(sslength ss)))</P>
<P>(ssdel (ssname ss n) ss2)</P>
<P>);这样的结果就是最后生成的region选择集合ss2了!</P>

xxsheng 发表于 2006-5-26 11:33:00

fishnono发表于2006-5-26 10:40:00static/image/common/back.gif
(defun c:dpxq (/ thick ss1 ss2 ss no pt sumlen n 1_area tot_area max_area en danpin_area zhiliang)(prompt \"选择单品外轮廓线(必...


<P>&nbsp; (prompt "选择单品外轮廓线(必须闭合)")<BR>&nbsp; (setq ss1 (ssget))&nbsp; <BR>&nbsp; (setq ss(entlast))<BR>&nbsp; (command "_region" ss1 "")<BR>&nbsp; (setq ss2(getthelastregion ss));这里得到最后生成的region选择集合-------<BR>&nbsp;;你下面的程序根据自己的改吧~~~</P>
<P><BR>(defun getthelastregion (lastent / newentsel en)<BR>&nbsp; (if (/= nil lastent)<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq newentsel (ssadd))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (/= nil (setq lastent (entnext lastent)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq en (entget lastent))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= "REGION" (cdr (assoc '0 en)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ssadd lastent newentsel)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; newentsel<BR>);by xxsheng</P>
<P>;说明一下:如果前面的region对象不多的话,建议用楼上的方法,如果多的话,用这个方法.没有测试过速度!</P>

fishnono 发表于 2006-5-29 14:06:00

问题按照9楼的方法解决了,速度很快。谢谢各位
页: [1] 2
查看完整版本: 请教关于选择集的问题