[转载]ssget 用法详解 by yxp
總結(jié)得很好的ssget用法.....如此好文,必須轉(zhuǎn)載.
原文地址: http://blog.csdn.net/yxp_xa/article/details/72229202
ssget 用法詳解 by yxp 2017/04/10
ALisp 編程時 ssget 是無處不在的,靈活的選擇集構(gòu)建方式,可以輕松的處理圖形,體現(xiàn)了 Lisp 相對其他語言的優(yōu)點(diǎn)。
然而強(qiáng)大的 ssget 估計(jì)很多人都不清楚用法,包括各種教程對 ssget 的描述都不夠完善,本文試圖總結(jié) ssget 的用法,不足之處請讀者指正。
語法:
(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])ssget 的參數(shù)均為可選參數(shù),需要注意的是可選參數(shù)之間的組合條件。
以下語法表示中 <parameter> 尖括號代表必選,[parameter] 方括號代表可選。
一、選擇集的窗口參數(shù)
- [sel-method] 字符串類型,不區(qū)分大小寫,指定一個選擇方法。
- [pt1 [pt2]] 表類型,由三個數(shù)字的點(diǎn)參數(shù)表,表示 xyz 坐標(biāo),也可以是僅包括xy 的坐標(biāo)。
[pt-list]表類型,由點(diǎn)參數(shù)表組成的表。
C 窗交(反選)
如果指定了該參數(shù),則必須跟一對點(diǎn)創(chuàng)建一個矩形窗口,與矩形窗口相交的對象均被加入選擇集。
參數(shù)語法: (ssget "c" <pt1> <pt2> [filter-list])
此時,[pt-list] 參數(shù)不能出現(xiàn),否則 ssget 將會返回一個錯誤提示:錯誤的點(diǎn)參數(shù)
示例:
W 窗口(正選)
與 C 參數(shù)語法及用法類似,但功能不同,只有在矩形窗口內(nèi)完整的對象才會被加入選擇集。
參數(shù)語法: (ssget "w" <pt1> <pt2> [filter-list])
參數(shù)前加下劃線 "_w" 可以使代碼在不同版本的CAD平臺下兼容,建議寫上。
CP 圈交(多邊形反選)
如果指定了該參數(shù),則必須用構(gòu)成多邊形的點(diǎn)表響應(yīng),與多邊形相交的對象被加入選擇集。
參數(shù)語法: (ssget "CP" <pt-list> [filter-list])
此時點(diǎn)參數(shù) [pt1] [pt2] 不能出現(xiàn),而且,CP 參數(shù)依賴 <pt-list> 的順序來構(gòu)成一個多邊形。
例如四個點(diǎn)按順序連接為一個8字型,而不是一個矩形,ssget 將返回一個空選擇集,即使對象與窗口相交。
如果參數(shù)為少于3個點(diǎn)的表,也將返回一個 nil。
示例:
WP 圈圍(多邊形正選)
與 CP 參數(shù)語法及用法類似,但只有被多邊形窗口包圍的對象才會被加入選擇集。
參數(shù)語法: (ssget "wp" <pt-list> [filter-list])
F 欄選
將參數(shù)點(diǎn)表連接為一條折線,與折線相交的對象被加入選擇集。
參數(shù)語法: (ssget "f" <pt-list> [filter-list])
pt-list 最少由2個點(diǎn)組成表,CP/WP 參數(shù)最少需要 3 個點(diǎn)。
P 前一批創(chuàng)建的圖形
包括 CAD 命令或 LISP 程序創(chuàng)建的圖形對象。
參數(shù)語法: (ssget "p" [filter-list])
P 參數(shù)不能和 [pt1 [pt2]] [pt-list] 任何一個點(diǎn)參數(shù)組合,否則將返回一個錯誤,有的 CAD 版本會返回 nil
當(dāng)分解(EXPLODE)一個 CAD 圖形時,p 方法特別有用,可以一次性建立分解后的所有對象選擇集。
L 最后一個創(chuàng)建的對象
包括 CAD 命令或 LISP 程序創(chuàng)建的對象,注意和 P 參數(shù)的區(qū)別。
參數(shù)語法: (ssget "l" [filter-list])
在獲取最后一個對象的圖元名時,以下代碼是等價的,但是后者不能提供直接過濾功能。
I 隱含窗口選擇
參數(shù)語法: (ssget "i" [filter-list])
CAD 命令有兩種執(zhí)行方式,第一種先命令后選擇,第二種先選擇后命令。所以在 Lisp 中也允許先選擇后命令,
而且這方式可以通過系統(tǒng)變量 pickfirst 來關(guān)閉(值為 0),此時 I 參數(shù)失效,(ssget "i") 將返回 nil。
選擇對象后,可以用 (sssetfirst nil) 取消選擇集的亮顯狀態(tài)。
X 整個文件
在當(dāng)前打開的CAD文件中選擇所有對象,包括關(guān)閉、凍結(jié)圖層中的圖元和可見屏幕外的圖元,不分大小寫。
參數(shù)語法: (ssget "x" [filter-list])
X 用法與 A 用法等價,(ssget "A") 也是選擇所有對象。
:E 拾取框
用拾取框選擇對象,此時 ssget 將不再拉出一個矩形窗口,直到點(diǎn)右鍵結(jié)束選擇。
參數(shù)語法: (ssget ":E" [filter-list])
與 :E 對應(yīng)的 :N 參數(shù)為只能拉出一個矩形窗口選擇,而不能通過點(diǎn)選拾取對象。
:S 僅允許單一選擇集
使用:s參數(shù)時,ssget 將點(diǎn)選對象一次就會結(jié)束,無論是否選中對象,未選中則返回 nil,可節(jié)省一次回車確認(rèn)。
參數(shù)語法: (ssget ":S" [filter-list])
說明: ":S" 參數(shù)和 ":E" 可以同時使用,例如: (ssget "_:S:e")
以下參數(shù)可以組合使用, "+" 或 "-",例如:(ssget "_:S+D")
:D 重復(fù)選擇
允許同一個對象多次加入選擇集,每選擇一次,則加入一次。
參數(shù)語法: (ssget ":D" [filter-list])
例如:畫兩條直線,然后運(yùn)行代碼 (setq ss (ssget ":D")),框選3次直線后。(sslength ss) 返回 6
:L 不選擇鎖定圖層對象
注意: L、:L、-L 的參數(shù)是不同的。
參數(shù)語法: (ssget ":L" [filter-list])
ssget 默認(rèn)選擇所有圖層對象,這樣在程序中需判斷圖層是否鎖定,才能編輯,否則 lisp 代碼將返回錯誤。
其他方法還有A :A -A _:V _:U _:R -M -P :P -G -L :? 等參數(shù)以及組合用法,有興趣的朋友可以測試。
這些參數(shù)的用法官方并未在語法參考里公布,估計(jì)是程序測試留下的接口,CAD 更新時可能被關(guān)閉,不建議使用。
注意事項(xiàng):
- ssget 帶點(diǎn)參數(shù)調(diào)用時,可能會受到自動捕捉的影響,一般先將系統(tǒng)變量 osmode 置零。
- ssget 點(diǎn)參數(shù)包圍的矩形、多邊形應(yīng)在當(dāng)前繪圖區(qū)域內(nèi)可見,否則 ssget 僅返回可見區(qū)域內(nèi)的對象選擇集。
- 創(chuàng)建選擇集會消耗 AutoCAD 的臨時文件存儲區(qū),所以 AutoLISP 不允許同時創(chuàng)建多于 128 個選擇集。
- 例如:畫一個圓,然后執(zhí)行以下代碼:
(repeat 130 (setq a (cons (ssget "l") a))) - 這段程序循環(huán)了 130 次,AutoCAD提示 "錯誤: 超出選擇集數(shù)量的最大范圍",如果繼續(xù)調(diào)用 (ssget) 將返回 nil;此時,只有清空選擇集變量 (setq a nil) 才能繼續(xù)調(diào)用 ssget。
ssget 選擇時沒有自定義提示,如果特別需要可用第三方函數(shù),比如飛詩的: Fsxm-ssget
二、選擇集的過濾條件
[filter-list] 過濾條件,表類型,指定與屬性(DXF 組碼)匹配的對象被加入選擇集。
常用支持過濾的 DXF 組碼:
指定對象實(shí)體類型,語法 '((0 . types)),對象類型 types 為字符,不分大小寫,常用的實(shí)體類型如下:
- "POINT"、"TEXT"、"MTEXT" 點(diǎn)、單行文本、多行文本
- "LINE"、"LWPOLYLINE"、"SPLINE" 直線、多段線、樣條曲線
- "CIRCLE"、"ARC"、"ELLIPSE" 圓、圓弧、橢圓
- "HATCH"、"DIMENSION" 填充、標(biāo)注
"ATTDEF"、"INSERT" 屬性文字、圖塊
"," 邏輯或,對象類型可多選,名稱用 "," 分隔。例如,創(chuàng)建直線和文本的選擇集:
(ssget '((0 . "TEXT,LINE")))
框選對象后,將只有直線和文本被選中(亮顯)并加入選擇集。"~" 邏輯非,用來排除某類型。例如:創(chuàng)建除過圖塊的選擇集
(ssget '((0 . "~INSERT,LINE")))
顯然,第二個類型 LINE 毫無意義,因?yàn)榈谝粋€ ~INSERT 非圖塊類型范圍包含了 LINE 類型。"*" 通配符,用來表示模糊類型。例如,創(chuàng)建所有直線的選擇集:
(ssget '((0 . "*LINE")))
框選對象后,可以將 "LINE"、"LWPOLYLINE"、"SPLINE"、"MLINE" 類型加入選擇集,和以下過濾條件等價:(ssget '((0 . "LINE,LWPOLYLINE,SPLINE,MLINE")))
通常我們用后者實(shí)現(xiàn)精確過濾。其他:(ssget '((0 . "*E"))) 選擇過濾所有直線、圓、橢圓的類型,因?yàn)樗麄兊奈沧帜付际?E。
(ssget '((0 . "*"))) 與 (ssget) 等價,相當(dāng)于全選。
(ssget '((0 . "~*"))) Lisp 都不知道你要干嘛了,因?yàn)樗裁匆策x不上。0 組碼可以和其他組碼組成 list 表過濾。例如,選擇半徑為 20 的圓:
(ssget '((0 . "CIRCLE")(40 . 20)))
通常,對于字符類型組碼均支持通配過濾語法,包括線型名、文字樣式、圖層等。
例如:選擇非 0 層的所有對象(ssget '((8 . "~0")))
注意:并不是所有組碼都支持過濾,例如下面過濾條件將返回 nil,即使存在句柄為 "25F" 的圓。(ssget '((0 . "CIRCLE")(5 . "2*")))
-4 組碼
邏輯條件運(yùn)算
用 -4 組碼和邏輯運(yùn)算符組成表對,將一個或幾個表項(xiàng)包夾。邏輯運(yùn)算符對大小寫不敏感。
表對必須成對出現(xiàn),如:(-4 . "<xx")...(-4 . "xx>"), 常用的邏輯運(yùn)算符如下:
or 并集。例如,選擇直線和文本:
(ssget ((-4 . "<or")(0 . "line")(0 . "text")(-4 . "or>")))
(ssget ((0 . "TEXT,LINE")(-4 . "<or")(62 . 1)(62 . 3)(-4 . "or>")))
顯然與 (ssget '((0 . "text,LINE"))) 等價,但后者寫法更簡潔。
例如,選擇顏色為紅色和綠色的文字和直線:and 交集。例如,選擇圖層為 "notes",顏色為綠色的單行文本:
(ssget ((-4 . "<and")(0 . "text")(8 . "notes")(62 . 3)(-4 . "and>")))not 非。例如,選擇非 "notes" 層的實(shí)體對象:
(ssget ((-4 . "<not")(8 . "notes")(-4 . "not>")))
顯然與 (ssget '((8 . "~notes"))) 等價。
注意:非運(yùn)算只能有一個表項(xiàng)被包夾,否則 ssget 將返回 nil。xor 異或。即半加法,實(shí)現(xiàn)二進(jìn)制加法的不進(jìn)位運(yùn)算。邏輯意義: 相同為0,相異為1。
例如,選擇在 "notes" 層不是綠色、或是綠色而不在 "notes" 層的文本對象:(ssget ((0 . "text")(-4 . "<xor")(8 . "notes")(62 . 3)(-4 . "xor>")))
注意:異或運(yùn)算只能有兩項(xiàng),如果超過兩項(xiàng)或只有一項(xiàng),ssget 將返回 nil。邏輯運(yùn)算可以嵌套,組成更復(fù)雜的條件運(yùn)算。
關(guān)系條件運(yùn)算
用 -4 組碼和關(guān)系運(yùn)算符組成表對,放在需要比較的表項(xiàng)前。
與成對出現(xiàn)的邏輯條件不同,關(guān)系表對單個出現(xiàn),常用關(guān)系運(yùn)算符如下:
例如:選擇半徑大于或等于20的圓
(ssget ((0 . "CIRCLE")(-4 . ">=")(40 . 20)))選擇半徑20的圓,顏色不是紅色
(ssget ((0 . "CIRCLE")(-4 . "<and")(-4 . "!=")(62 . 1)(40 . 20)(-4 . "and>")))對于含有多個元素的比較,如點(diǎn)坐標(biāo),可用 "," 隔開關(guān)系運(yùn)算符。
選擇圓心坐標(biāo) x>100, y<120, z=0,圖層名以 cir 開始的圓
選擇圖形顏色不是隨層 (bylayer) 的對象,可用以下代碼
(ssget ((-4 . "&")(62 . 255)))
我們知道 CAD 的索引顏色數(shù)為 1-255,用 2 個字節(jié)表示,隨層的顏色為 0,在 DXF 組碼中并不顯示。
此時如果用 (ssget '((-4 . ">")(62 . 0))) 來過濾是不對的,隨層顏色的圖形也將被選上。
如果用二進(jìn)制的 8 個 1 與當(dāng)前顏色數(shù)進(jìn)行邏輯與的位運(yùn)算 &,其結(jié)果都不是 0, 即為真, 2^8=255
1 組碼
文本內(nèi)容的匹配運(yùn)算(與 wcmatch 函數(shù)語法相同),相當(dāng)于簡單正則。
對于包含大量文本對象的圖形,有時候需要精確的過濾條件,可以通過以下特殊符號來實(shí)現(xiàn):
例1: CAD 中有以下 3 組 TEXT 文本
① X=35.614 ② Y=356.201 ③ Z=11.526要求匹配以 "X=" 這兩個字母開始的單行文本
(ssget '((0 . "TEXT") (1 . "X=*")))
返回第 ① 組文本的選擇集
解讀: "X=" 不是通配運(yùn)算符,在此表示精確匹配,后面加 "*" 是任意符號。要求匹配以 "X=" 或 "Y=" 這兩個字母開始的單行文本
(ssget '((0 . "TEXT") (1 . "[X|Y]=*")))
返回第 ①、② 組文本選擇集
解讀: 并列出現(xiàn)的字符,用 "|" 連接。
要求匹配 包含數(shù)字小于 100 的單行文本
(ssget '((0 . "TEXT") (1 . "@=##[.]*)))
返回第 ①、③ 組文本選擇集
解讀: "##" 代表兩個數(shù)字,兩個數(shù)字連接最大只能是 99。小數(shù)點(diǎn)單獨(dú)出現(xiàn)用方括號 [.]
如果僅僅是".",而沒有方括號,則代表任意特殊符號。
例2: 我們再試驗(yàn)一組復(fù)雜的文本,在 CAD 中寫入以下 10 組 TEXT 文本
① abcde ② 12345 ③ -25.390 ④ *&@125 ⑤ F35
⑥ #54-65 ⑦ 頭文字 ⑧ 36 75 ⑨ F ⑩ /(*&%@!要求匹配 包含數(shù)字 文本
(ssget '((0 . "TEXT") (1 . "#")))
以上代碼將選中 ②③④⑤⑥⑧ 包含數(shù)字的 6 組文本
解讀: "#" 代表一個數(shù)字字符,要求匹配 以*開始的 文本
(ssget '((0 . "TEXT") (1 . "**")))以上代碼將選中 ④ 以*開始的 1 組文本 解讀: 因?yàn)?#34;"` 是通配符,要匹配語法中的專用字符用轉(zhuǎn)義 ""
要求匹配 不含特殊字符 文本
(ssget '((0 . "TEXT") (1 . "~*.*")))
以上代碼將選中 ①②⑤⑦⑨,注意:負(fù)號和小數(shù)點(diǎn)也是特殊符號
解讀: "." 代表一個特殊字符,前后加 "." 包含一個特殊字符,不含特殊字符就是 "~*.*"要求匹配 純數(shù)字 的單行文本,包含負(fù)號和小數(shù)點(diǎn)
(setq ss (ssget '((0 . "TEXT") (1 . "~*[~.–9]*))))
解讀: 負(fù)負(fù)得正,兩次取非可獲取數(shù)字本身,括號內(nèi) "[~.-]", 意為包含小數(shù)點(diǎn)和負(fù)號。
注意, 220-11 不能參加計(jì)算的數(shù)字也會被包括其中。
- 下面給出常用匹配規(guī)則,歡迎測試
匹配數(shù)字,不含小數(shù)點(diǎn)和正負(fù)號: "~*[~0-9]*"如: 9824
匹配 26 個小寫字母: "~*[~a-z]*" 如: loveu
匹配大寫字母或數(shù)字: "~*[~A-Z],~[~0-9]*" 如: NASAA 或 9527
匹配大寫字母和數(shù)字混排: "~*[~A-Z|0-9]*" 如: F36D
空格是一個很特殊的字符,用一個空格可以匹配任意個空格,其他字符沒有這個特性。
例如: (wcmatch " " " ") 返回 T
-3 組碼
擴(kuò)展數(shù)據(jù)過濾。ALISP 中可以用如下方法給圖形添加擴(kuò)展數(shù)據(jù),增加自定義組碼及表值。
第一步,注冊一個擴(kuò)展對象應(yīng)用名
(regapp "xapp")第二步,選擇一個圖元并返回組碼
(setq En (entget (car (entsel))))第三步,定義加入圖元的擴(kuò)展數(shù)據(jù)
(setq data '((-3 ("xapp" (1000 . "你好中國")))))第四步,將擴(kuò)展數(shù)據(jù)附著更新圖元
(entmod (append En data))完成,我們可以檢查一下擴(kuò)展數(shù)據(jù)
(assoc -3 (entget (car (entsel)) '("xapp")))
結(jié)果返回 (-3 ("xapp" (1000 . "你好中國")))
采用這種方法添加擴(kuò)展數(shù)據(jù),用 EXPLODE 命令不能清除。
與 -3 組碼無關(guān)的話題。 用 VLisp 函數(shù)給圖元添加數(shù)據(jù)比較簡單,無需提前注冊名稱,例如 (vlax-ldata-put (car (entsel)) "xa" "你好中國") 查詢數(shù)據(jù)如下: (vlax-ldata-get (car (entsel)) "xa") 返回 "你好中國" 采用這種方法,用 EXPLODE 命令可以炸開擴(kuò)展數(shù)據(jù),相當(dāng)于清除圖元的擴(kuò)展數(shù)據(jù)。
在某些二次開發(fā)的 CAD 程序中,擴(kuò)展數(shù)據(jù)被大量使用,用來分類圖元對象(圖層分類法容易被修改)。
這時候的 ssget 方顯英雄本色,用來精確選擇,再適合不過。在參數(shù)化制圖時,添加擴(kuò)展數(shù)據(jù),當(dāng)參數(shù)
發(fā)生變化時,很容易遍歷修改這些對象,由于擴(kuò)展數(shù)據(jù)的不可見和不可分解的特性,不會被用戶誤操作。
這時候只需要用下面代碼即可完成過濾,連對象類別的 0 組碼 都不需要了。
(ssget '((-3 ("xapp"))))
2 組碼
暫缺。
轉(zhuǎn)載于:https://www.cnblogs.com/edata/p/7892635.html
總結(jié)
以上是生活随笔為你收集整理的[转载]ssget 用法详解 by yxp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java、JSP老年公寓管理系统
- 下一篇: s5pv210的工作模式