CAD/Lisp

도곽선택하여 선축척,치수축척을 변경하는 간단한 리습입니다.

명령어 xxx 를 개인 입맛에 맞게 변경하여 사용하시면 됩니다.

 

 

도곽블럭_선택하여_선축척변경.lsp


 

;;; 도곽선택하여 선축척,치수축척 변경
;;; 2017-08-17, izzarder.com
(defun c:xxx ( / blk ent scale)
   (setvar 'CMDECHO 0)
   (command "_.UNDO" "_BE")
   (if 
      (and
         (setq blk (car (entsel "\n>> 기준 도곽 선택: ")))
         (setq ent (entget blk))
         (= (cdr (assoc 0 ent)) "INSERT")
      )
      (progn
         (setq scale (cdr (assoc 41 ent)))
         (setvar 'LTSCALE scale)
         (setvar 'DIMSCALE scale)  ;;; 필요없으면 앞에 주석처리 ;;;
         (prompt (strcat "선축척이 " (rtos scale 2) " 로 변경되었음..."))
      )
   )
   (command "_.UNDO" "_E")
   (setvar 'CMDECHO 1)
   (princ)
)

 

 

 

'CAD > Lisp' 카테고리의 다른 글

도곽선택하여 선축척,치수축척 변경  (0) 2017.08.17
Logand 함수 사용법  (0) 2016.12.25
Getfiled 사용법  (0) 2016.12.25
시간과 관련된 함수  (0) 2016.12.04
vl-file-systime 의 사용법  (0) 2016.12.04
현재 도면에 로딩된 모든 명령어/함수/변수 보기  (0) 2016.10.17

Logand 함수 사용법

2016.12.25 12:40

캐드의 변수는 종종 비트의 합계로 나타낸다.

예를 들어 오스냅의 경우

 

1 : _end
2 : _mid
4 : _cen
8 : _nod
16 : _qua
32 : _int
64 : _ins
128 : _per
256 : _tan
512 : _nea
2048 : _app
8192 : _par

 

인데.. 오스냅을 [ _end + _cen + _int ] 를 한꺼번에 걸고 싶다면.. [ 1 + 4 + 32 ] = 37 이므로...

 

(setvar 'OSMODE 37) 또는 (setvar 'OSMODE (+ 1 4 32)) 로 입력하면 된다.

 

logand 함수는 이 속에 포함된 비트의 존재여부를 반환하게 된다.

예를 들어 37 이라는 숫자에 4 비트가 포함되었는지를 찾고자 한다면..

 

(logand 4 37) : 4 반환

이므로, 4가 포함되었다는 의미이다.

 

즉, 오스냅이 39 : [ _end + _mid + _cen + _int ]로 걸린 상태에서 cen 이 설정되었는지를 검사한 후, 이 cen 을 오스냅에서 빼고 싶다면...

 


(if (= (logand 4 (getvar 'OSMODE)) 4)
   (setvar 'OSMODE (- (getvar 'OSMODE) 4))
)

반환 : 35

 

를 하면, 오스냅에서 _cen 이 빠지게 된다.

만약 _cen 이 걸려 있지 않다면.. nil 을 반환하게 된다.

 

* 입력 숫자는 앞뒤의 숫자가 바뀌어도 결과는 같다.

 

'CAD > Lisp' 카테고리의 다른 글

도곽선택하여 선축척,치수축척 변경  (0) 2017.08.17
Logand 함수 사용법  (0) 2016.12.25
Getfiled 사용법  (0) 2016.12.25
시간과 관련된 함수  (0) 2016.12.04
vl-file-systime 의 사용법  (0) 2016.12.04
현재 도면에 로딩된 모든 명령어/함수/변수 보기  (0) 2016.10.17

Getfiled 사용법

2016.12.25 11:59

특정 파일을 열거나, 저장할 때 사용하는 함수가 Getfiled 이다.

(getfiled "메세지" "경로" "확장자" frag)

 

구문의 예는 다음과 같다.

(getfiled "파일선택" (getvar 'DWGPREFIX) "dwg" 17)


 

* frag 설명

 

맨 뒤의 frag 는 숫자에 따라서 기능이 다른데..

 

1 (bit 0) : 파일을 저장할 때 사용함.

같은 이름의 파일이 존재하면, 덮어쓰기를 물어봄.

 

4 (bit 2) : 사용자가 확장자를 입력하는 것을 허용.

즉, 사용자가 aaa.rrr 로 입력하면.. aaa.rrr 을 반환함.

이 비트가 꺼져 있으면.. 구문에 정의된 확장자만 허용됨.

즉 사용자가 aaa.rrr 로 입력하면, aaa.rrr.dwg 를 반환함.

사용될 일이 없음.

 

8 (bit 3) : 이 bit가 설정되고 bit 0 이 설정되지 않으면, 입력 된 파일 이름에 대한 검색을 수행

검색 결과, 파일을 찾으면 경로를 제거하고 파일 이름만 반환함.

단, 동일한 이름의 파일이 다른 폴더에 있는 경우 경로 이름을 제거하지 않음.
이 비트가 설정되지 않으면 getfiled는 경로 이름을 포함하여 전체 파일 이름을 반환함.
즉, 다른 검색경로까지 파일을 찾으므로, 이 bit는 사용하지 않는 것이 좋음.

 

16 (bit 4) : 구문에 입력된 파일이름을 무시하고, 경로만 인식함.

즉, getfiled 함수는 기본 파일 이름이 없다고 가정

예를 들어, 구문을 (getfiled "파일선택" "C:\\Users\\외부참조연습.dwg" "dwg" 4) 이렇게 입력하면 화면에 다름과 같이 나타남.

 

 

 

그러나, (getfiled "파일선택" "C:\\Users\\외부참조연습.dwg" "dwg" 16) 로 입력하면, 파일이름을 무시하고, 빈칸으로 나타남.

 

 


 

32 (bit 5) : 이 bit+bit 0 (즉 33)이 설정되면 덮어쓰기 경고를 생략함. 사용될 일이 없음.

 

64 (bit 6) : 사용자가 파일이름이 아닌, URL을 입력해도, 인터넷 검색을 하지 않음.

 

128 (bit 7) : URL 입력을 허용하지 않음.

 

* 그러므로, 결국 사용되는 frag 는

파일을 저장할 때 : 1 + 16 + 128 = 145  또는 1 + 16 = 17

파일을 가져올 때 : 16 + 128 = 144  또는 16

로 사용하는 것이 좋고,

 

만약 특정 파일로 저장되거나, 읽어 오고 싶을 때는

파일을 저장할 때 : 1 + 128 = 129

파일을 가져올 때 : 128

로 사용하면 된다.

단, 이 때는 구문에 파일이름까지 넣어야 한다.

예 : (getfiled "파일선택" "C:\\Users\\외부참조연습.dwg" "dwg" 129)

 

 

 

이 함수는 몇가지 짜증나는 단점이 있는데...

 

1. 화면의 크기가 너무 작고, 고정되어 있다.

즉, 아래 크기처럼 단지 4개의 파일만 보일 뿐이다.

 

 

그러나, BricsCAD, GstarCAD 는 이 화면을 크게 늘릴 수 있다. (처음부터 크게 나온다. ㅠㅠ)

 

2. AutoCAD 2009 이하에서는, 파일을 선택하자마자 맨 윗줄의 폴더나 파일로 튀어 버린다.

이게 제일 짜증인데, "확인"을 누르면, 맨 윗줄의 폴더가 열리거나, 그 파일로 대체되어 버린다. ㅠㅠ

그나마, AutoCAD 2010 부터는 해결되었으며, BricsCAD, GstarCAD, ZWCAD 에서는 애초에 이런 문제가 없다.

그러므로, AutoCAD는 다른 함수의 처리능력을 포함하여, 2010 부터가 비로서 제대로 된 버전의 시작인 듯 하다.

 

AutoCAD 2009 이하의 사용자가 이 짜증에서 벗어나는 요령은..

화면이 나타나면... 스크롤로 내려서 파일을 선택하는 것이 아니라...

아무 파일 (폴더)를 우선 클릭한 다음.. 슬라이드를 내려서 파일을 찾고, 클릭하면 된다.

즉, 선택의 순서가 아래와 같다.

 

 

이런 순서대로 파일을 선택하면, 수명을 늘릴 수 있다.

 

3. 여러 파일의 선택이 안된다. 단지 하나의 파일만 선택할 수 있다.

   이 문제가 매우 거슬리는데, 다른 응용프로그램을 사용하지 않는 이상, 별 방법이 없다.

 

 

 

'CAD > Lisp' 카테고리의 다른 글

도곽선택하여 선축척,치수축척 변경  (0) 2017.08.17
Logand 함수 사용법  (0) 2016.12.25
Getfiled 사용법  (0) 2016.12.25
시간과 관련된 함수  (0) 2016.12.04
vl-file-systime 의 사용법  (0) 2016.12.04
현재 도면에 로딩된 모든 명령어/함수/변수 보기  (0) 2016.10.17

시간과 관련된 함수

2016.12.04 17:59

시간과 관련된 시스템변수는 다음과 같습니다.

 

 

 구분

 변수

 반환값

 비고

 (rtos 변수 2 10)

 현재시간

 (getvar 'DATE)

 2.45773e+06

 줄리안

 "2457727.721527778"

 파일 생성시간

 (getvar 'TDCREATE)

 2.45772e+06

 줄리안  "2457721.034143519"

 파일 최종 저장시간

 (getvar 'TDUPDATE)

 2.45773e+06

 줄리안  "2457727.656655093"

 현재시간

 (getvar 'CDATE)

 2.01612e+07

 년월일.시간

 "20161204.17192200"

 

(getvar 'CDATE) 의 결과는 우리가 잘 아는 "년월일.시간분초"입니다. 즉, 2016년 12월 4일 17시 19분 22.00초 입니다.

그러나, 위의 세가지의 사간은 "수정 율리우스력 날짜(MJD) 형식"으로 표시됩니다. (줄리안시간이라고 합니다.)

이 형식은  "<율리우스력 일 수>.<하루에 대한 십진 분수>" 로써, 기원전 4713년 1월 1일 정오를 기준 날짜로 시작하여 경과 일 수를 지정하는 전세계적 과학 표준입니다. (주로 천문학에서 사용된다고 합니다.)

 

이 어렵게 생긴 줄리안시간을 우리가 알 수 있는 년월일시간으로 변경하는 방법은 다음과 같습니다.

 

;;; ------------------------

;;; 줄리안시간을 일반 년월일시간으로 변경

;;; izzarder.com

(defun xi:Julian->Time (value format)
   (menucmd (strcat "m=$(edtime,$(getvar," value ")," format ")"))
)

 

이를 이용해서 (gatvar 'DATE) 를 줄리안으로 변경하면 다음과 같습니다.

(xi:Julian->Time "DATE" "YYYY MO DD HH MM") => "2016 12 04 17 34"

 

이 때 사용되는 포맷의 영문자 조합의 의미는 아래와 같습니다.

 

 구분

 내용

 결과

 D

 일

 4

 DD

 0으로 시작하는 일

 04

 DDD

 영문요일 짧게

 Mon

 DDDD

 영문요일 전체

 Monday

 M

 월

 6

 MO

 0으로 시작하는 월

 06

 MON

 영문월 짧게

 Jun

 MONTH

 영문월 전체

 June

 YY

 두자리 년도

 16

 YYYY

 네자리 년도

 2016

 H

 시간

 7

 HH

 0으로 시작하는 시간

 07

 MM

 분

 30

 SS

 초

 25

 MSEC

 밀리초

 250

 AM/PM

 대문자 오전 또는 오후

 AM

 am/pm

 소문자 오전 또는 오후

 am

 A/P

 대문자 오전 또는 오후 짧게

 A

 a/p

 소문자 오전 또는 오후 짧게

 a

 

 

다른 방법이 하나 더 있긴 합니다만, AutoCAD 에서만 사용할 수 있습니다.

 

Command: (load "julian")

Command: (jtoc (getvar 'tdcreate))  => (1996 9 30 21 22 38.74)

Command: (jtoc (getvar 'tdupdate))  =>  (2003 2 11 8 33 30.682)

 

반환되는 숫자리스트는 (년, 월, 일, 시, 분, 초) 입니다.

 

 

vl-file-systime 은 화일의 최종 저장 시간을 반환하는 함수입니다.

이 함수는 모든 화일에 해당 됩니다.

 

예를 들어

(vl-file-systime "c:/sample.lsp")
을 입력할 경우

(1998 4 3 8 10 6 52 154) 이러한 숫자 리스트를 반환하는데.. 

 

앞에서 부터 (1998년, 4월, 그 주의 3번째 날(수요일), 8일, 10시, 6분, 52.154초) 입니다.

즉, 이 함수로 요일까지 알 수 있습니다.

 

다른 용도는 열린 파일을 판단하는 용도입니다.

파일이 "파일을 찾을 수 없거나, 프로그램에 의해 열려져 있다면" 이 함수는 무조건 nil 을 반환합니다.

 

즉, 파일 리스트에서 열려 있는 파일인지를 판단할 수 있습니다.

(foreach dwg dwglst
   (if (null (vl-file-systime dwg))
      (setq OpenedFileLst (cons dwg OpenedFileLst))
   )
)

 처럼요..

 

그러나, BricsCAD 와 GstarCAD 는 열려 있든 그렇지 않든.. 파일을 찾을 수 없을 때만 nil을 반환하므로, 열려 있는 파일을 찾는 용도로 사용되지 못합니다.


ZWcad는 버전마다 다른데요..

2015+ 는 오토캐드와 같지만, 2017 부터는 BricsCAD 와 같습니다.


 

* 해외 포럼에서 열려 있든 그렇지 않든.. 파일 저장시간을 탐색하는 함수를 논의한 것이 있어서 링크해 둡니다.

https://www.theswamp.org/index.php?topic=43559.0

 

'CAD > Lisp' 카테고리의 다른 글

Getfiled 사용법  (0) 2016.12.25
시간과 관련된 함수  (0) 2016.12.04
vl-file-systime 의 사용법  (0) 2016.12.04
현재 도면에 로딩된 모든 명령어/함수/변수 보기  (0) 2016.10.17
vla-get-selectionsets, vla-get-activeselectionset 활용법  (0) 2016.05.08
=, eq, equal  (0) 2016.04.02

MyLsp.lsp

 

 

 

;;;============================================================================;
;; 현재 도면에 로딩된 명령어/함수/변수 기록
;; edit by izzarder
;;;============================================================================;
(defun c:MyLsp (/ A B FILE GETKW LST N TEMP_FILE consp is-command is-function my-princ)
;;;----------------------------------------------------------------------------;
   (defun Is-command (a /)
      (and
         (equal "C:" (substr (xstrcase a) 1 2))
         (Is-function (eval (read a)))
      )
   )
;;;----------------------------------------------------------------------------;
   (defun consp (lst)
      (not (vl-list-length lst))
   )
;;;----------------------------------------------------------------------------;
   (defun Is-function (b /)
      (or
         (and
            (= 'LIST (type b))
            (not (consp b))
            (> (length b) 1)
            (or (= 'LIST (type (car b)))
               (not (car b))
            )
         )
         (= 'SUBR (type b))
         (= 'USUBR (type b))
         (= 'EXRXSUBR (type b))
      )
   )
;;;----------------------------------------------------------------------------;
   (defun My-princ (a / c)
      (if
         (setq c (type (eval (read a))))
         (setq c (vl-symbol-name c))
         (setq c "nil")
      )
      (setq c (strcat "(" c ")"))
      (if
         (= "C:" (substr a 1 2))
         (setq a (substr a 3))
      )
      (while (< (strlen a) 40)
         (setq a (strcat a " "))
      )
      (while (< (strlen c) 20)
         (setq c (strcat c " "))
      )
      (strcat a c)
   )
;;;----------------------------------------------------------------------------;
   (initget "Commands Functions Variables")
   (setq getkw (getkword "\n>> 선택 [Commands/Functions/Variables] <P> </P><VARIABLES>: "))
   (setq lst (acad_strlsort (atoms-family 1)))
   (setq Temp_File (vl-filename-mktemp nil nil ".txt"))
   (setq file (open Temp_File "w"))
   (cond
      (  (= getkw "Commands")
         (repeat (setq n (length lst))
            (setq a (xstrcase (nth (setq n (1- n)) lst)))
            (if (Is-command a)
               (write-line (My-princ a) FILE)
            )
         )
      )
      (  (= getkw "Functions")
         (repeat (setq n (length lst))
            (setq a (xstrcase (nth (setq n (1- n)) lst)))
            (if
               (and
                  (setq b (eval (read a)))
                  (Is-function b)
               )
               (write-line (My-princ a) FILE)
            )
         )
      )
      (  'T
         (repeat (setq n (length lst))
            (setq a (xstrcase (nth (setq n (1- n)) lst)))
            (setq b (eval (read a)))
            (if
               (and
                  (not (Is-function b))
                  (not (Is-command a))
               )
               (write-line (My-princ a) FILE)
            )
         )
      )
   )
   (close FILE)
   (startapp "notepad" Temp_File)
   (princ)
)

 

http://www.afralisp.net/visual-lisp/tutorials/selection-sets.php


 

(defun c:xxx ( / ssets acadDocument newsset ctr item)
   (vl-load-com)
   (setq acadDocument (vla-get-activedocument (vlax-get-acad-object)))
   (setq ssets (vla-get-selectionsets acadDocument))
   (setq newsset (vla-add ssets "SS1"))
   (vla-selectOnScreen newsset)
   (setq ctr 0)
   (repeat (vla-get-count newsset)
      (setq item (vla-item newsset ctr))
      (setq check (vlax-property-available-p item "Color" T))
      (if check
         (vlax-put-property item 'Color 5)
      ) 
      (setq ctr (1+ ctr))
   ) 
   (vla-delete (vla-item ssets "SS1"))
   (princ)
)



(defun c:xxx ( / ssets acadDocument newsset ctr item)
   (vl-load-com)
   (setq acadDocument (vla-get-activedocument (vlax-get-acad-object)))
   (setq ss (ssget (list (cons 0 "INSERT"))))
   (setq ssets (vla-get-activeselectionset acadDocument))
   (vlax-for obj ssets
      (vla-explode obj)
   ) 
   (vla-delete ssets)
   (princ)
)


=, eq, equal

2016.04.02 21:10

리습 함수 중 =, eq, equal 은 비슷하면서 다릅니다.

 

--------------------------------------------------------

(setq a (1+ 2))

(setq b 3)  

 

일 때,

 

(= a b)   : T

(eq a b) : T

(equal a b) : T

 

로 모두 같습니다.

 

--------------------------------------------------------

그러나,

 

(setq a 3)

(setq b 3.1)

 

일 때,

 

(= a b)   : nil

(eq a b) : nil

(equal a b) : nil

(equal b c 0.1) : nil

(equal b c 0.2) : T

 

입니다.

즉 equal 은 오차범위를 지정할 수 있습니다.

 

--------------------------------------------------------

또한

 

(setq a '(a b c))

(setq b '(a b c))

 

일 때,

 

(= a b)   : nil

(eq a b) : nil

(equal a b) : T

 

입니다.

즉, equal 만 리스트의 비교가 가능합니다.

 

--------------------------------------------------------

또한

 

(setq a '(a b c))

(setq b '(a b c))

(setq c b)

 

일 때,

 

(= a c)   : nil

(eq a c) : nil

(equal a c) : T

 

이지만,

 

(= b c)   : T

(eq b c) : T

(equal b c) : T

 

로 나옵니다.

 

조금 헷갈릴 수도 있지만,

위에서 "(setq c b)" 라고 이미 정의를 했기 때문에, 그 내용은 보지도 않고, 같다고 정의를 해놓은 것만 판단하여

 = 이나, eq 나 모두 T 를 반환하는 것입니다.

 

--------------------------------------------------------

또한

 

(setq a '(a b c))

 

일 때,

 

(= a '(a b c))   : nil

(eq a '(a b c)) : nil

(equal a '(a b c)) : T

 

입니다.

즉, 무조건 리스트의 비교는 equal 만 가능한 것을 알 수 있습니다.

 

--------------------------------------------------------

이 것을 보면, = 과 eq 가 완전히 같은 것 같지만..

그렇지 않습니다.

 

(= 1 2 3 4 5)   : nil

(= 1 1 1 1 1)   : T

(eq 1 1 1 1 1) : error 가 난다.

 

즉, = 는 여러개의 숫자를 비교할 수 있습니다.

심지어

 

(= "a" "a" "a" "a")  : T

 

도 가능합니다. 즉 여러개의 숫자, 문자열의 비교가 가능한 것입니다. (리스트 형식이 아님.!!!)

 

이 것을 보면, eq 보다 = 가 같은 기능이면서 더 범위가 넓은 것 처럼 보이지만, 사실 그렇지 않습니다.

 

--------------------------------------------------------

(setq enta (car (entsel)))  

(setq entb (car (entsel)))

 

로, 같은 객체를 선택한 다음..

 

(= enta entb)   : nil

(eq enta entb)   : T

(equal enta entb)   : T

 

로 나옵니다. 즉, 객체 간의 비교 등은 eq 또는 equal 을 사용해야 합니다.

 

--------------------------------------------------------

그러므로, 자신이 스스로 어떤 경우에 어떤 것을 사용하는지의 원칙을 정해서 구문을 짜면 일관성이 있어 마음이 편합니다.

 

저의 경우

 

숫자, 문자의 비교는 =

객체의 비교는 eq

리스트의 비교는 equal

오차범위 내에서의 숫자 비교는 equal 을 사용하고 있습니다.

 

여기서, 이렇게 나누지 말고, 모두 equal 을 사용해도 되는 것 아니냐? 고 하실 듯 한데요..

결과는 같습니다만.. 세가지로 나눈 이유는 아래와 같습니다.

 

1. equal 함수보다, eq 또는 = 함수의 속도가 평균 약 10% 정도 더 빠릅니다.

2. 글자수의 차이로 인해 좀 더 빠르게 구문을 짤 수 있습니다.

3. 글자수의 차이로 인해, 결과 파일의 용량이 줄어 듭니다.

 

 

블럭안의 치수만 지우는 방법입니다.

치수로 캐드의 입장에서는 하나의 블럭이기 때문에.. 이를 처리하는 과정을 잘 숙지하면 리습에 더 빨리 익숙해 질 수 있습니다.


아래 방법은 선택한 영역 안에서만 처리를 하는 방법이고,

;;;-----------------------------------------------------------------------------;
;; 블럭안의 치수만 지우는 두가지 방법
;; 출처:https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/delete-dimensions-inside-blocks/td-p/2840905
;;;-----------------------------------------------------------------------------;
(defun c:Test (/ ss i sn name lst)
  (vl-load-com)
;;;        ------ Tharwat 15. June. 2012 -----      ;;;
;;; codes to delete all dimensions entities in the  ;;;
;;;                selected blocks                  ;;;
   (if (not acdoc)
      (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
   )
   (if (setq ss (ssget "_:L" '((0 . "INSERT"))))
      (repeat (setq i (sslength ss))
         (setq sn (ssname ss (setq i (1- i))))
         (if (not (member (setq name (cdr (assoc 2 (entget sn)))) lst))
            (progn
               (setq lst (cons name lst))
               (vlax-for each (vla-item (vla-get-blocks acdoc) name)
                  (if (wcmatch (vla-get-objectname each) "AcDb*Dimension")
                  (vla-delete each))
               )
            )
         )
      )
      (princ)
   )
   (if ss (vla-regen acdoc AcAllviewports))
   (princ)
)


이 방법은 도면 전체에 대한 처리 방법입니다.

선택영역을 구분하지 않는다면, 이 방법이 통상적으로 사용되는 방법입니다.

또한 세번째 방법도 존재할 수 있는데.. 이 방법을 주구문으로 하여 내부에 선택영역의 블럭 이름과 비교를 해서 처리는 하는 방법도 있을 수 있습니다.

;;;-----------------------------------------------------------------------------;
(defun c:Test  (/ aDoc)
   (vl-load-com)
   (setq aDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
   (vlax-for blk (vla-get-blocks aDoc)
      (if
         (and
            (eq :vlax-false (vla-get-isXref blk))
            (eq :vlax-false (vla-get-isLayout blk))
            (not (wcmatch (vla-get-name blk) "`*D*"))
         )
         (vlax-for dim blk
            (if (wcmatch (vla-get-ObjectName dim) "AcDb*Dimension")
               (vla-delete dim))
         )
      )
   )
   (vla-regen aDoc acAllViewports)
   (princ)
)


'CAD > Lisp' 카테고리의 다른 글

vla-get-selectionsets, vla-get-activeselectionset 활용법  (0) 2016.05.08
=, eq, equal  (0) 2016.04.02
블럭안의 치수만 지우기  (0) 2016.02.20
vl-every, vl-some 함수  (0) 2016.02.20
vla-get-blocks 과 그 내용  (0) 2015.09.09
블럭의 삽입점을 좌표로 받는 네가지 방법  (0) 2015.07.28

vl-every, vl-some 함수

2016.02.20 01:34


vl-every 는 구성체의 모든 것이 T 이면 T 를 반환

(vl-every
   '(lambda (%)
      (= (type %) 'STR)
   )
   (list "a" "b" "c" 1)
)

nil 을 반환

 

(vl-every
   '(lambda (%)
      (= (type %) 'STR)
   )
   (list "a" "b" "c")
)

T 를 반환


 

;;;-----------------------------------------------------------------------------;

상기와 같은 구문

(apply 'and
   (mapcar
      '(lambda (%)
         (= (type %) 'STR)
      )
      (list "a" "b" "c")
   )
)

T 를 반환

 


;;;-----------------------------------------------------------------------------;

vl-some 은 그 반대로써, 하나라도 T면 T를 반환

;;;-----------------------------------------------------------------------------;

(vl-some
   '(lambda ( x ) (= x 3))
   '(0 1 2 3 4 5)
)

T 를 반환

 

이는 아래와 같다.

(apply 'or
   (mapcar
      '(lambda (%)
         (= (type %) 'STR)
      )
      (list "a" "b" "c" 1)
   )
)

 T 를 반환

 

 

'CAD > Lisp' 카테고리의 다른 글

=, eq, equal  (0) 2016.04.02
블럭안의 치수만 지우기  (0) 2016.02.20
vl-every, vl-some 함수  (0) 2016.02.20
vla-get-blocks 과 그 내용  (0) 2015.09.09
블럭의 삽입점을 좌표로 받는 네가지 방법  (0) 2015.07.28
선택 세트의 DXF 코드 내용을 변경하는 보조함수  (0) 2015.03.05

도면은...


모형공간에 

직선 1개

AAA블럭 1개 (내부에 폴리선 1개)

BBB외부참조 1개 (내부에 아크 1개)

CCC외부참조 1개 (내부에 DDD블럭, DDD블럭 안에 문자 1개)

치수 1개


종이공간에 

원 1개


가 있을 때...



1. 블럭테이블 보기

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(princ (vla-get-objectname Blk))

(princ "\n")

)


반환:

AcDbBlockTableRecord    ;모형공간

AcDbBlockTableRecord    ;종이공간

AcDbBlockTableRecord    ;블럭 AAA

AcDbBlockTableRecord    ;블럭 bbb

AcDbBlockTableRecord    ;블럭 ccc

AcDbBlockTableRecord    ;블럭 ccc|ddd

AcDbBlockTableRecord    ;치수블럭

 


2. 블럭테이블 이름 보기

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(princ (vla-get-name Blk))

(princ "\n")

)

반환:

*Model_Space
*Paper_Space
AAA
bbb
ccc
ccc|ddd
*D4



3. 모든 객체 반환

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

반환:

AcDbLine    ;모형공간 직선

AcDbBlockReference    ;모형공간

AcDbBlockReference    ;종이공간

AcDbBlockReference    ;블럭 AAA

AcDbRotatedDimension    ;치수블럭

AcDbViewport    ;종이공간 기본 Viewport (보이지도, 삭제되지도 않는...)

AcDbViewport    ;종이공간 Viewport

AcDbCircle    ;종이공간 원

AcDbPolyline    ;블럭 AAA 내의 폴리선

AcDbArc    ;외부참조 bbb 내의 호

AcDbBlockReference    ;외부참조 ccc 내의 블럭 ddd

AcDbText    ;외부참조 ccc 내의 블럭 ddd 안의 문자

AcDbLine    ;치수블럭 내의 보조선

AcDbLine    ;치수블럭 내의 보조선

AcDbLine    ;치수블럭 내의 보조선

AcDbLine    ;치수블럭 내의 보조선

AcDbSolid    ;치수블럭 내의 도트 솔리드

AcDbSolid    ;치수블럭 내의 도트 솔리드

AcDbMText    ;치수블럭 내의 치수문자

AcDbPoint    ;치수블럭 내의 포인트

AcDbPoint    ;치수블럭 내의 포인트

AcDbPoint    ;치수블럭 내의 포인트



4. 치수블럭, 외부참조 안에 있는 블럭 내의 객체 포함 모든 객체 반환 (외부참조내 객체만 제외)

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if (eq (vla-get-isXref blk) :vlax-false)

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

)

반환:

AcDbLine

AcDbBlockReference

AcDbBlockReference

AcDbBlockReference

AcDbRotatedDimension

AcDbViewport

AcDbViewport

AcDbCircle

AcDbPolyline

AcDbText

AcDbLine

AcDbLine

AcDbLine

AcDbLine

AcDbSolid

AcDbSolid

AcDbMText

AcDbPoint

AcDbPoint

AcDbPoint




5.각 공간별 모든 객체

   외부참조/일반블럭/치수블럭 내의 객체, 외부참조 안에 있는 블럭 내의 객체를 제외한 모든 객체 

(vlax-for lay (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object)))

(vlax-for obj (vla-get-Block lay)

(princ (vla-get-objectname obj))

(princ "\n")

)

)

반환:

AcDbViewport
AcDbViewport
AcDbCircle
AcDbLine
AcDbBlockReference
AcDbBlockReference
AcDbBlockReference
AcDbRotatedDimension




6.일반블럭, 치수블럭내의 객체 포함 모든 객체 반환 

   (외부참조 내의 객체와 외부참조 안에 있는 블럭내의 객체만 제외)

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if 

(and

(eq (vla-get-isXref blk) :vlax-false)

(not (wcmatch (vla-get-name blk) "*|*")) ; 외부참조 안의 일반블럭 제외

)

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

)

반환:
AcDbLine
AcDbBlockReference
AcDbBlockReference
AcDbBlockReference
AcDbRotatedDimension
AcDbViewport
AcDbViewport
AcDbCircle
AcDbPolyline
AcDbLine
AcDbLine
AcDbLine
AcDbLine
AcDbSolid
AcDbSolid
AcDbMText
AcDbPoint
AcDbPoint
AcDbPoint



7. 일반블럭과 치수블럭 내의 객체만...

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if 

(and

(eq (vla-get-isXref blk) :vlax-false) ; 외부참조 제외

(eq (vla-get-isLayout blk) :vlax-false) ; 공간별 객체 제외

(not (wcmatch (vla-get-name blk) "*|*")) ; 외부참조 안의 일반블럭 제외

)

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

)

반환:

AcDbPolyline

AcDbLine

AcDbLine

AcDbLine

AcDbLine

AcDbSolid

AcDbSolid

AcDbMText

AcDbPoint

AcDbPoint

AcDbPoint



8.일반블럭 내의 객체만.... (치수블럭 제외)

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if 

(and

(eq (vla-get-isXref blk) :vlax-false) ; 외부참조 제외

(eq (vla-get-isLayout blk) :vlax-false) ; 공간별 객체 제외

(not (wcmatch (vla-get-name blk) "*|*")) ; 외부참조 안의 일반블럭 제외

(not (wcmatch (vla-get-name blk) "`*D*")) ; 무명블럭 제외 (치수블럭은 기본적으로 무명블럭임)

)

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

)

반환:

AcDbPolyline



9.외부참조 내의 객체제외, 외부참조 안에 있는 블럭내의 객체제외, 치수블럭 내의 객체제외,

  이외의 모든 객체

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if 

(and

(eq (vla-get-isXref blk) :vlax-false) ; 외부참조 제외

(not (wcmatch (vla-get-name blk) "*|*")) ; 외부참조 안의 일반블럭 제외

(not (wcmatch (vla-get-name blk) "`*D*")) ; 무명블럭 제외 (치수블럭은 기본적으로 무명블럭임)

)

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

)

반환:

AcDbLine

AcDbBlockReference

AcDbBlockReference

AcDbBlockReference

AcDbRotatedDimension

AcDbViewport

AcDbViewport

AcDbCircle

AcDbPolyline



10.외부참조/일반블럭/치수블럭 내의 객체, 외부참조 안에 있는 블럭 내의 객체를 제외한 모든 객체

(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if (eq (vla-get-isLayout blk) :vlax-true)

(vlax-for obj Blk

(princ (vla-get-objectname obj))

(princ "\n")

)

)

)

반환:

AcDbLine

AcDbBlockReference

AcDbBlockReference

AcDbBlockReference

AcDbRotatedDimension

AcDbViewport

AcDbViewport

AcDbCircle




이를 종합하면 다음과 같다.

어떤 목적을 가지고 있느냐에 따라서 적절히 가져다 사용하시면 된다.



번호

일반객체 

블럭내 

객체

 외부참조 내

객체

외부참조 내

블럭 내

객체

치수블럭 내 

객체 

모형/종이

공간

객체 

구분가능

 3

 4

 5

 6

 7

 8

 9

 10

△ 



**** 5번과 10번의 차이

모형공간, 종이공간의 객체를 구분하고자 한다면 5번과 10번을 사용할 수 있는데.. 

두 방식의 차이는 vla-get-name 으로 확실히 알 수 있다.

즉,


(vlax-for lay (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object)))

(princ (vla-get-name lay))

(princ "\n")

)

반환:

Layout1

Model



(vlax-for Blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

(if (eq (vla-get-isLayout blk) :vlax-true)

(progn

(princ (vla-get-name blk))

(princ "\n")

)

)

)

반환:

*Model_Space

*Paper_Space


로 되기 때문이다.

그러므로, 종이공간의 각 배치의 겉보기 이름으로 구분을 쉽게 할 수 있는 것이 5번이다.



**** 사용법


1. 모형공간, 종이공간의 객체를 구분하면서, 일반블럭내의 객체까지 반환하고 싶다면..

5번과 7번의 조합으로...


2. 모형공간, 종이공간 구분없이 일반블럭 내의 객체까지 반환하고 싶다면...

6번만 사용하면 된다.

 



 

(vlax-safearray->list (vlax-variant-value (vlax-get-property obj 'InsertionPoint)))

 

(vlax-get obj 'insertionpoint)

 

(vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint obj)))

 

(safearray-value (variant-value (vlax-get-property obj 'InsertionPoint)))

 

 

 

;; XiCAD 에 사용된 보조 함수 중 선택 세트의 DXF 코드 내용을 변경하는 보조함수
;; 사용방식 : (xi:SubUpd 객체 DXF코드 변경할내용)
;; 사례1 : 원의 반경을 500 으로 변경
;; (xi:SubUpd (car (entsel"\n>> 원 선택: ")) 40 500)
;; 사례2 : 문자 내용을 "가나다라" 로 변경
;; (xi:SubUpd (car (entsel"\n>> 문자 선택: ")) 1 "가나다라")
;; 사례3 : 선의 시작 점을 (0 0 0) 으로 변경
;; (xi:SubUpd (car (entsel"\n>> 시작점을 변경할 선을 선택: ")) 10 '(0 0 0))
;; ssget 도 사용가능

;; (xi:SubUpd (ssget) 62 1)
;; izzarder.com



;; xi:getDXF (xi:getDXF code ename)
(defun xi:getDXF (code ename / ent lst a)
  (if (= (type code) 'LIST)
    (progn
      (setq ent (entget ename)
            lst '()
      )
      (foreach a code
        (setq lst (cons (list a (cdr (assoc a ent))) lst))
      )
      (reverse lst)
    )
    (if        (= code -3)
      (cdr (assoc code (entget ename '("*"))))
      (cdr (assoc code (entget ename)))
    )
  )
)


(defun xi:SubUpd (ename code val / ent x y i s1)
  (cond ((= (type ename) 'ENAME)
  (setq ent (entget ename))
  (if (and (= (type code) 'LIST) (= (type val) 'LIST))
    (mapcar '(lambda (x y) (xi:SubUpd ename x y)) code val)
    (progn
      (if (= (xi:getdxf code ename) nil)
        (entmod (append ent (list (cons code val))))
        (entmod (subst (cons code val) (assoc code ent) ent))
      )
      (entupd ename)
    )
  )
)
((= (type ename) 'PICKSET)
  (setq i -1)
  (while (setq s1 (ssname ename (setq i (1+ i))))
    (xi:SubUpd s1 code val)
  )
)
((= (type ename) 'LIST)
  (foreach s1 ename (xi:SubUpd s1 code val))
)
  )
  ename
)
(princ)

아래는 오토캐드의 배경색을 검정색과 흰색으로 켬끔하는 두가지 리습입니다.

리맥 대단합니다.

 

출처 : http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-routine-for-changing-color-of-background-in-model-space/td-p/4724669

 

 

(defun c:tbg()
  (defun wb () ;;white background
    (setq whitebackground T)
    (setq acadobject (vlax-get-acad-object))
    (setq acadpref (vlax-get-property acadobject 'preferences))
    (setq acaddisp (vlax-get-property acadpref 'display))
    (vlax-put-property acaddisp 'GraphicsWinmodelBackgrndColor 16777215)
    (vlax-put-property acaddisp 'ModelCrosshairColor 0)
  )

  (defun bbb () ;; black background
    (setq whitebackground nil)
    (setq acadobject (vlax-get-acad-object))
    (setq acadpref (vlax-get-property acadobject 'preferences))
    (setq acaddisp (vlax-get-property acadpref 'display))
    (vlax-put-property acaddisp 'GraphicsWinmodelBackgrndColor 0)
    (vlax-put-property acaddisp 'ModelCrosshairColor 16777215)
  )

  (if whitebackground (bbb) (wb))
)



-------------------------------------------------------

 (defun c:tbg ( / col )
    (if tbg:flg
        (setq col 16777215 tbg:flg nil)
        (setq col 0        tbg:flg  t )
    )
    (foreach prp '(graphicswinmodelbackgrndcolor modelcrosshaircolor)
        (vlax-put-property (acdisp) prp (setq col (- 16777215 col)))
    )
    (princ)
)
(defun acdisp nil
    (eval
        (list 'defun 'acdisp 'nil
            (vla-get-display (vla-get-preferences (vlax-get-acad-object)))
        )
    )
    (acdisp)
)
(vl-load-com) (princ)

치수선을 폭파해서, 문자만 남기고 나머지를 삭제하는 구문입니다.

프로그램이 가진 목적보다는 mapcar 의 활용을 잘 볼 수 있어서 기록해 둡니다.

 

출처 : 아키모아, 올빼미님

 

 

(defun c:TX () 
   (mapcar 
      '(lambda (x / f ss1)
         (setq f (entlast))
         (vl-cmdf "_.explode" x)
         (setq ss1 (ssadd))
         (while (setq f (entnext f)) (setq ss1 (ssadd f ss1)))
         (mapcar 
            '(lambda (e)
               (if (not (= (cdr (assoc 0 (entget e))) "MTEXT")) (entdel e))
            )
            (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
         )
      )
      (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "DIMENSION"))))))
   )
   (princ)
)

'CAD > Lisp' 카테고리의 다른 글

선택 세트의 DXF 코드 내용을 변경하는 보조함수  (0) 2015.03.05
오토캐드 배경색 변경  (0) 2015.02.18
mapcar 의 활용예 - 문자남기고 삭제  (0) 2015.02.12
치수관련 변수 목록  (0) 2015.01.03
문자 또는 숫자 자동 증가  (0) 2014.11.22
grread 옵션 정리  (0) 2014.11.10

치수관련 변수 목록

2015.01.03 18:23

치수 관련 변수가 워낙 복잡하여 정리해 보았음

 

 

 

 

 

 

'CAD > Lisp' 카테고리의 다른 글

오토캐드 배경색 변경  (0) 2015.02.18
mapcar 의 활용예 - 문자남기고 삭제  (0) 2015.02.12
치수관련 변수 목록  (0) 2015.01.03
문자 또는 숫자 자동 증가  (0) 2014.11.22
grread 옵션 정리  (0) 2014.11.10
SSGET 사용법 정리  (0) 2014.11.07

문자 또는 숫자 자동 증가

출처 : http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/getstring-if-ascii-if-integer/td-p/4397555

 

 

(defun c:tag ( / fun ins ocs str uxa )
    (while
        (not
            (or (= "" (setq str (getstring "\nSpecify grid line tag: ")))
                (wcmatch str "~*[~0-9]*")
                (wcmatch str "~*[~a-zA-Z]*")
            )
        )
        (princ "\n  숫자 또는 알파벳문자이어야 함...")
    )
    (if (/= "" str)
        (progn
            (if (wcmatch str "~*[~0-9]*")
                (setq fun (lambda ( x ) (itoa (1+ (atoi x)))))
                (setq fun LM:A++)
            )
            (setq ocs (trans '(0.0 0.0 1.0) 1 0 t)
                  uxa (angle '(0.0 0.0 0.0) (trans (getvar 'ucsxdir) 0 ocs t))
            )
            (while (setq ins (getpoint "\nSpecify point : "))
                (entmake
                    (list
                       '(00 . "TEXT")
                       '(72 . 4)
                       '(73 . 0)
                        (cons 001 str)
                        (cons 050 uxa)
                        (cons 007 (getvar 'textstyle))
                        (cons 040 (getvar 'textsize))
                        (cons 010 (trans ins 1 ocs))
                        (cons 011 (trans ins 1 ocs))
                        (cons 210 ocs)
                    )
                )
                (setq str (fun str))
            )
        )
    )
    (princ)
)

 

 

;; Alpha++  -  Lee Mac
;; Increments an alphabetical string by one, e.g. AZ => BA
;; a - [str] alphabetical string
(defun LM:A++ ( a )
    (   (lambda ( f ) (vl-list->string (reverse (f (reverse (vl-string->list a)) t))))
        (lambda ( l x )
            (cond
                (   (null l) (if x '(65) '(97)))
                (   (= 090 (car l)) (cons 65 (f (cdr l)  t )))
                (   (= 122 (car l)) (cons 97 (f (cdr l) nil)))
                (   (cons (1+ (car l)) (cdr l)))
            )
        )
    )
)
(princ)

 

'CAD > Lisp' 카테고리의 다른 글

mapcar 의 활용예 - 문자남기고 삭제  (0) 2015.02.12
치수관련 변수 목록  (0) 2015.01.03
문자 또는 숫자 자동 증가  (0) 2014.11.22
grread 옵션 정리  (0) 2014.11.10
SSGET 사용법 정리  (0) 2014.11.07
리스트에서 순서 뽑기 기초  (0) 2014.10.27

grread 옵션 정리

2014.11.10 16:35
grread 는 사용하기 따라서 꽤 유용한 함수이다.

 

이 함수는 현재 마우스의 위치와 클릭을 했는지, 키보드를 입력했다면 어떤 것을 입력했는지를 반환하기 때문에 각 입력에 따른 별도의 기능을 부여할 수 있다는 장점이 있다.

 

grread 는 (grread 't 15 2) 이와 같이 두쌍의 숫자를 옵션으로 가지고 있는데.. 앞의 숫자는 반환값에 대한 것. 뒤의 숫자는 커서의 모양을 제어하는 것이다.

 

앞의 숫자는 다음과 같다.

 

1 (bit 0) : 움직이는 좌표와 키보드 동작을 반환

2 (bit 1) : 움직이는 좌표와 펑션키를 포함한 모든 키를 반환

4 (bit 2) : 커서키를 제어하는 뒤쪽의 숫자를 반영함. 이 비트를 선택하지 않으면, 뒷의 커서제어가 먹지 않음.

8 (bit 3) : 에러메시지를 억제함.

 

뒤의 숫자는 다음과 같다.

 

0 : 십자선만 있고, 오스냅박스를 감춤

1 : 커서를 감춤 (십자선 감춤) 즉, 화면에 아무 것도 나타나지 않음

2 : 객체선택사각 (PickBox)만 나타남

 

 

그러므로, 만약 객체선택사각으로 기능을 제어할 때는

(grread 't (+ 1 4 8) 2) 로 해주면 된다.

 

그리고, 현재 사용하는 커서 모양을 유지하면서 좌표를 얻고 싶으면

(grread 't (+ 1 8) 0) 인데, 4비트가 포함될 경우에는 뒤쪽 숫자가 의미 없으므로,

(grread 't (+ 1 8)) 처럼 앞 숫자만 있어도 무방하다.

 

 

이 함수를 돌린 결과는 두개의 쌍으로 반환되는데..

마우스 이동 : (3 (좌표)) , 이동중인 좌표, 계속 변경됨

마우스 클릭 : (5 (좌표)) , 클릭한 점의 고정 좌표

오른쪽 마우스클릭 : (25 (화면에 대한 마우스 x축 위치)

   만약 1920x1080 화면이고, 마우스가 왼쪽 끝에 있다면 30 정도를 반환함 

키보드 입력 : (2 (키보드고유번호))

 

이 때, 각 키보드에 대한 고유번호는 아래와 같다.

;;;=============================================================================;
;; grread 키보드 고유번호 정리
;; 2017. 01. izzarder.com
;;;=============================================================================;
(defun c:xxx ( / code)
   (while
      (progn
         (setq code (grread T 9))
         (cond
            ((= (car code) 5)     T)
            ((= (car code) 3)     (princ "do_LeftClick"))
            ((= (car code) 11)    (princ "do_RightClick"))
            ((= (car code) 25)    (princ "do_RightClick"))
            ((equal code '(2 0))  (princ "do_CTRL-@"))
            ((equal code '(2 1))  (princ "do_CTRL-A"))
            ((equal code '(2 2))  (princ "do_F9"))
            ((equal code '(2 3))  (princ "do_F12"))
            ((equal code '(2 4))  (princ "do_F6"))
            ((equal code '(2 5))  (princ "do_F5"))
            ((equal code '(2 6))  (princ "do_F3"))
            ((equal code '(2 7))  (princ "do_F7"))
            ((equal code '(2 8))  (princ "do_Back"))
            ((equal code '(2 9))  (princ "do_Tab"))
            ((equal code '(2 10)) (princ "do_CTRL-J"))
            ((equal code '(2 11)) (princ "do_CTRL-K"))
            ((equal code '(2 12)) (princ "do_CTRL-L"))
            ((equal code '(2 13)) (princ "do_Return"))
            ((equal code '(2 14)) (princ "do_CTRL-N"))
            ((equal code '(2 15)) (princ "do_F8"))
            ((equal code '(2 16)) (princ "do_CTRL-P"))
            ((equal code '(2 17)) (princ "do_CTRL-Q"))
            ((equal code '(2 18)) (princ "do_CTRL-R"))
            ((equal code '(2 19)) (princ "do_CTRL-S"))
            ((equal code '(2 20)) (princ "do_F4"))
            ((equal code '(2 21)) (princ "do_F10"))
            ((equal code '(2 22)) (princ "do_CTRL-V"))
            ((equal code '(2 23)) (princ "do_F11"))
            ((equal code '(2 24)) (princ "do_CTRL-X"))
            ((equal code '(2 25)) (princ "do_CTRL-Y"))
            ((equal code '(2 26)) (princ "do_CTRL-Z"))
            ((equal code '(2 27)) (princ "do_CTRL-["))
            ((equal code '(2 28)) (princ "do_CTRL-\\"))
            ((equal code '(2 29)) (princ "do_CTRL-]"))
            ((equal code '(2 30)) (princ "do_CTRL-^"))
            ((equal code '(2 31)) (princ "do_CTRL-_"))
            ((equal code '(2 32)) (princ "do_Space"))
            ((equal code '(2 33)) (princ "do_ExclamationMark"))
            ((equal code '(2 34)) (princ "do_DoubleQuote"))
            ((equal code '(2 35)) (princ "do_Hash"))
            ((equal code '(2 36)) (princ "do_Dollar"))
            ((equal code '(2 37)) (princ "do_Percent"))
            ((equal code '(2 38)) (princ "do_Ampersand"))
            ((equal code '(2 39)) (princ "do_Apostrophe"))
            ((equal code '(2 40)) (princ "do_OpenParenthesis"))
            ((equal code '(2 41)) (princ "do_CloseParenthesis"))
            ((equal code '(2 42)) (princ "do_Asterisk"))
            ((equal code '(2 43)) (princ "do_Plus"))
            ((equal code '(2 44)) (princ "do_Comma"))
            ((equal code '(2 45)) (princ "do_Minus"))
            ((equal code '(2 46)) (princ "do_Dot"))
            ((equal code '(2 47)) (princ "do_Slash"))
            ((equal code '(2 48)) (princ "do_0"))
            ((equal code '(2 49)) (princ "do_1"))
            ((equal code '(2 50)) (princ "do_2"))
            ((equal code '(2 51)) (princ "do_3"))
            ((equal code '(2 52)) (princ "do_4"))
            ((equal code '(2 53)) (princ "do_5"))
            ((equal code '(2 54)) (princ "do_6"))
            ((equal code '(2 55)) (princ "do_7"))
            ((equal code '(2 56)) (princ "do_8"))
            ((equal code '(2 57)) (princ "do_9"))
            ((equal code '(2 58)) (princ "do_Colon"))
            ((equal code '(2 59)) (princ "do_Semicolon"))
            ((equal code '(2 60)) (princ "do_LessThan"))
            ((equal code '(2 61)) (princ "do_Equals"))
            ((equal code '(2 62)) (princ "do_GreatThan"))
            ((equal code '(2 63)) (princ "do_QuestionMark"))
            ((equal code '(2 64)) (princ "do_At"))
            ((equal code '(2 65)) (princ "do_A"))
            ((equal code '(2 66)) (princ "do_B"))
            ((equal code '(2 67)) (princ "do_C"))
            ((equal code '(2 68)) (princ "do_D"))
            ((equal code '(2 69)) (princ "do_E"))
            ((equal code '(2 70)) (princ "do_F"))
            ((equal code '(2 71)) (princ "do_G"))
            ((equal code '(2 72)) (princ "do_H"))
            ((equal code '(2 73)) (princ "do_I"))
            ((equal code '(2 74)) (princ "do_J"))
            ((equal code '(2 75)) (princ "do_K"))
            ((equal code '(2 76)) (princ "do_L"))
            ((equal code '(2 77)) (princ "do_M"))
            ((equal code '(2 78)) (princ "do_N"))
            ((equal code '(2 79)) (princ "do_O"))
            ((equal code '(2 80)) (princ "do_P"))
            ((equal code '(2 81)) (princ "do_Q"))
            ((equal code '(2 82)) (princ "do_R"))
            ((equal code '(2 83)) (princ "do_S"))
            ((equal code '(2 84)) (princ "do_T"))
            ((equal code '(2 85)) (princ "do_U"))
            ((equal code '(2 86)) (princ "do_V"))
            ((equal code '(2 87)) (princ "do_W"))
            ((equal code '(2 88)) (princ "do_X"))
            ((equal code '(2 89)) (princ "do_Y"))
            ((equal code '(2 90)) (princ "do_Z"))
            ((equal code '(2 91)) (princ "do_OpenSquareBracket"))
            ((equal code '(2 92)) (princ "do_BackSlash"))
            ((equal code '(2 93)) (princ "do_CloseSquareBracket"))
            ((equal code '(2 94)) (princ "do_Caret"))
            ((equal code '(2 95)) (princ "do_UnderScore"))
            ((equal code '(2 96)) (princ "do_BackQuote"))
            ((equal code '(2 97)) (princ "do_a"))
            ((equal code '(2 98)) (princ "do_b"))
            ((equal code '(2 99)) (princ "do_c"))
            ((equal code '(2 100))(princ "do_d"))
            ((equal code '(2 101))(princ "do_e"))
            ((equal code '(2 102))(princ "do_f"))
            ((equal code '(2 103))(princ "do_g"))
            ((equal code '(2 104))(princ "do_h"))
            ((equal code '(2 105))(princ "do_i"))
            ((equal code '(2 106))(princ "do_j"))
            ((equal code '(2 107))(princ "do_k"))
            ((equal code '(2 108))(princ "do_l"))
            ((equal code '(2 109))(princ "do_m"))
            ((equal code '(2 110))(princ "do_n"))
            ((equal code '(2 111))(princ "do_o"))
            ((equal code '(2 112))(princ "do_p"))
            ((equal code '(2 113))(princ "do_q"))
            ((equal code '(2 114))(princ "do_r"))
            ((equal code '(2 115))(princ "do_s"))
            ((equal code '(2 116))(princ "do_t"))
            ((equal code '(2 117))(princ "do_u"))
            ((equal code '(2 118))(princ "do_v"))
            ((equal code '(2 119))(princ "do_w"))
            ((equal code '(2 120))(princ "do_x"))
            ((equal code '(2 121))(princ "do_y"))
            ((equal code '(2 122))(princ "do_z"))
            ((equal code '(2 123))(princ "do_OpenBrace"))
            ((equal code '(2 124))(princ "do_VerticalBar"))
            ((equal code '(2 125))(princ "do_CloseBrace"))
            ((equal code '(2 126))(princ "do_Tilde"))
            ((equal code '(2 127))(princ "do_Delete"))
            (  t )
         )
      )
   )
)

 

 

아래 구문을 돌려 보면 어떤 기능을 하는 것인지 아마도 확실히 알 수 있을 것이다.

;;;=============================================================================;
;; grread 예제
;; 2017. 01. izzarder.com
;;;=============================================================================;
(defun c:xxx ( / grdata code data)
   (while
      (progn
         (setq grdata (grread 't 9 0)
               code   (car grdata)
               data   (cadr grdata)
         )
         (cond
         (  (and (= 5 code) (listp data))
            t ; t는 함수를 계속 while 한다는 의미
         )
         (  (and (= 3 code) (listp data))
            (command "_LINE" '(0 0) data "")
            (princ "글릭")
            (princ data)
         )
         (  (= 25 code)
            (princ "오른쪽 마우스")
            (princ data)
         )
         (  (= 2 code)
            (cond
               (  (= 13 data)
                  (princ "엔터")
                  (princ data)
               )
               (  (= 32 data)
                  (princ "스페이스")
                  (princ data)
               )
               (  (vl-position data '(85 117))
                  (princ "대소문자 U")
                  (princ data)
               )
               (  t )
            )
         )
         (  t )
         )
      )
   )
)


 

 

 

'CAD > Lisp' 카테고리의 다른 글

치수관련 변수 목록  (0) 2015.01.03
문자 또는 숫자 자동 증가  (0) 2014.11.22
grread 옵션 정리  (0) 2014.11.10
SSGET 사용법 정리  (0) 2014.11.07
리스트에서 순서 뽑기 기초  (0) 2014.10.27
(mapcar) 와 (lambda)  (0) 2014.10.25

SSGET 사용법 정리

2014.11.07 01:16

; 한번의 선택만 허용

; 윈도우와 크로싱은 억제하지 않음.

; 위도우와 크로싱을 억제하기 위해서는 앞에 "+."  가 붙어야 함

(defun c:test1()
   (setq ss (ssget ":E:S" '((0 . "line"))))
   (command "erase" ss "")
)

 

 

; 블럭 내부 엔터티를 선택

; 즉 nentsel 을 여러개 하는 것과 같음

(defun c:test2()
   (setq ss (ssget ":N" '((0 . "insert"))))
   (command "erase" ss "")
)

 

 

; 중복 선택 허용

; 즉, 동일한 객체를 두 번 선택해도 선택 셋에 모두 포함됨

(defun c:test3()
   (setq ss (ssget ":D" '((0 . "insert"))))
   (sslength ss) ; 동일한 블럭을 4번 클릭하면, 선택갯수가 4로 표기됨
)

 

 

; 한번 선택으로 종료

; 선택의 방법은 피크, 윈도우, 크로싱이 모두 가능

; 즉, 다중 선택을 허용하나, 이 역시 한번의 선택만 허용 

(defun c:test4()
   (setq ss (ssget ":S" '((0 . "line"))))
   (command "erase" ss "")
)

 

 

; 잠긴 객체는 선택에서 제외 

(defun c:test5()
   (setq ss (ssget ":L" '((0 . "insert"))))
   (sslength ss)
)

 

 

; 이전 선택 객체 재 선택 

(defun c:test6()
   (setq ss (ssget "P" '((0 . "insert"))))
   (sslength ss)
)

 

 

; 단일 선택을 위한 첨가어. 아래 문구와 조합을 이루어 완성 

(defun c:test7() (setq ss (ssget "+." '((0 . "insert")))) (sslength ss) ) 

 

 

; 윈도우와 크로싱 억제, 피크로만 선택

; 그러나, 여러번 클릭해서 다중선택은 가능 

(defun c:test71()
   (setq ss (ssget "+.:E" '((0 . "insert"))))
   (sslength ss)
)

 

 

;  ":E:S" 와 동일하나, 하나의 객체, 한번의 선택만 가능

; 즉, 윈도우와 크로싱이 억제됨 

(defun c:test72()
   (setq ss (ssget "+.:S" '((0 . "insert"))))
   (sslength ss)
)

  

(defun c:tt73()
   (setq ss (ssget "+.:E:S" '((0 . "insert"))))
   (sslength ss)
)

  

 

; "+.:E" 와 비슷해 보이나, 윈도우와 크로싱을 억제하지 않음

; 다중선택 가능 

(defun c:test8()
   (setq ss (ssget ":E" '((0 . "insert"))))
   (sslength ss)
)

 

 

 

즉, 정리하면 다음과 같다. 

 

 

 윈도우, 크로싱

허용

 여러 객체 선택

허용

 여러번 선택

허용

 샘플명령어

 :E

 o

 o

 o

 test8

 :S

 o

 o

 x

 test4

 +.:E

 x

 o

 x

 test71

 +.:S

 x

 x

 x

 test72

 :E:S

 o

 o

 x

 test1

 +.:E:S

 x

 x

 x

 test73

 




; 도면상의 모든 객체 선택, 얼려져 있는 개체도 선택

(defun c:test9()
   (setq ss (ssget "X" '((0 . "insert"))))
   (sslength ss)
)


; x 와 같으나, 얼려진 객체 제외

(defun c:test10()
   (setq ss (ssget "A" '((0 . "insert"))))
   (sslength ss)
)


; 내용에 숫자가 포함된 문자를 선택

(defun c:test11()
   (setq ss (ssget '((1 . "*[0-9]*"))))
)


; 내용에 숫자가 포함된 문자를 선택 (위와 기능이 같음)

(defun c:test11()
   (setq ss (ssget '((1 . "*#*"))))
)


; 내용이 숫자로만 이루어진 문자를 선택

(defun c:test12() (setq ss (ssget '((0 . "text,mtext") (1 . "~*[~.0-9]*" )))) )


; 내용에 숫자가 포함되지 않은 문자만 선택

(defun c:test13()
   (setq ss 
      (ssget 
         '((-4 . "<NOT")
           (1 . "*[0-9]*")
           (-4 . "NOT>"))
          )
      )
)


;내용에 숫자가 포함되지 않은 문자만 선택 (위와 기능이 같음)

(defun c:test13()
   (setq ss(ssget '((1 . "~*#*"))))
)


;내용에 영문자가 포함된 문자만 선택

(defun c:test14()
   (setq ss (ssget '((1 . "*[a-A-z-Z]*"))))
)


;내용이 영문자로만 되어 있는 문자만 선택

(defun c:test15()
   (setq ss (ssget '((0 . "text,mtext") (1 . "~*[~a-A-z-Z]*" )))))


;내용에 영문자가 포함되어 있지 않은 문자만 선택

(defun c:test16()
   (setq ss (ssget '((-4 . "<NOT")
         (1 . "*[a-A-z-Z]*")
         (-4 . "NOT>")))
   )
)


; 내용에 영문자가 포함되어 있지 않은 문자만 선택 (위와 기능이 같음)

(defun c:test16()
   (setq ss (ssget '((1 . "~*[a-A-z-Z]*"))))
)


; 지름이 800보다 크고, 8000보다 작은 원만 선택

(defun c:test17()
   (setq ss (ssget '((-4 . "<and")
         (0 . "circle")
         (-4 . ">")(40 . 800)
         (-4 . "<")(40 . 8000)
         (-4 . "and>")
      )
   )
)

)


; 켜가 1,2,3,4 인 선 객체만 선택

(defun c:test18()
   (setq la '("1" "2" "3" "4")
           ss (ssget (list '(0 . "line") (cons 8 (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) la)))))
   )
)


; 단일 점으로 찍힌 객체만 선택

(defun c:test19()
   (setq pt (getpoint))
   (setq ss (ssget “c” pt pt))
)



; 통상적인 두점으로 선택하는 방식 (윈도우)

(defun c:test191()
   (setq pt (getpoint))
   (setq pt1 (getpoint))
   (setq ss (ssget “W” pt pt1))
)



; 켜가 0이 아닌 선만 선택

(defun c:test20()
   (setq ss (ssget '((-4 . "<AND")
         (0 . "line")
         (-4 . "<NOT")
         (8 . "0")
         (-4 . "NOT>")
         (-4 . "AND>"))
      )
   )
)



; 켜가 0이 아닌 선만 선택 (위와 기능이 같음)

(defun c:test21()
   (setq ss (ssget '((0 . "line")(8 . "~0"))))
)



; 켜이름에 영문자가 없는 선만 선택

(defun c:test22()
   (setq ss (ssget '((0 . "line")(8 . "~*[a-A-z-Z]*"))))
)


; 191과 같으나, 영역 윈도우의 형상이 눈에 보임 (윈도우)

(defun c:test23()
   (setq pt1 (getpoint))
   (setq pt3 (getcorner pt1))
   (setq ss(ssget "w" pt1 pt3 '((0 . "insert")))
)


; 점을 리스트로 만들어서 "wp" 로 선택해도 같은 결과임...

(setq ss(ssget "wp" ptl '((0 . "insert")))))


; 위와 같으나, 크로싱

(defun c:test24()
   (setq pt1 (getpoint))
   (setq pt3 (getcorner pt1))
   (setq ss(ssget "c" pt1 pt3 '((0 . "insert")))
)


; 점을 리스트로 만들어서 "cp" 로 선택해도 같은 결과임...

(setq ss (ssget "cp" ptl '((0 . "insert")))))


; 지나간 점으로 이루어진 선에 걸치는 직선 선택

(defun c:test25() (setq ptl nil) (while (setq pt (getpoint)) (setq ptl (cons pt ptl)) ) (setq ss (ssget "f" ptl '((0 . "line")))) (command "erase" ss "") )



'CAD > Lisp' 카테고리의 다른 글

문자 또는 숫자 자동 증가  (0) 2014.11.22
grread 옵션 정리  (0) 2014.11.10
SSGET 사용법 정리  (0) 2014.11.07
리스트에서 순서 뽑기 기초  (0) 2014.10.27
(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
리스트에서 순서뽑기

((A B) (C D) (E F) (G H))

caar - A
cadar - B
caadr - C
cadadr - D
caaddr - E
cadr (caddr - F
car (cadddr - G
cadr (cadddr - H
car - (A B)
cadr - (C D)
caddr - (E F)
cadddr - (G H)

 

(defun c:xx ( / lst)
   (setq lst (list '(a b) '(c d) '(e f) '(g h)))
   (princ "\n")
   (princ (caar lst))
   (princ "\n")
   (princ (cadar lst))
   (princ "\n")
   (princ (caadr lst))
   (princ "\n")
   (princ (cadadr lst))
   (princ "\n")
   (princ (caaddr lst))
   (princ "\n")
   (princ (cadr (caddr lst)))
   (princ "\n")
   (princ (car (cadddr lst)))
   (princ "\n")
   (princ (cadr (cadddr lst)))
   (princ "\n")
   (princ (car lst))
   (princ "\n")
   (princ (cadr lst))
   (princ "\n")
   (princ (caddr lst))
   (princ "\n")
   (princ (cadddr lst))
   (princ)
)

 

'CAD > Lisp' 카테고리의 다른 글

grread 옵션 정리  (0) 2014.11.10
SSGET 사용법 정리  (0) 2014.11.07
리스트에서 순서 뽑기 기초  (0) 2014.10.27
(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11

(mapcar) 와 (lambda)

2014.10.25 18:09

(mapcar) and (lambda)

by Kenny Ramage (http://www.afralisp.net/autolisp/tutorials/mapcar-and-lambda.php)


당신도 알다시피, LISP은 "목록처리", 즉 당신이 목록을 만질 수 있게 하는 꽤 많은 함수가 있다.

이 중에서 첫번째로 항목에 함수를 적용 할 수 있도록 명령인 (mapcar)를 알아보자.

(mapcar)

이 기능은 각 각의 리스트에 기능을 부여할 수 있게 한다. 아래 단순한 예제가 있다.

리스트의 각 항목에 1을 더할 경우


	(setq a 1)
	(mapcar '1+ (list a))

이 예제는 2 를 반환한다.

이 과정은

mapcar 는  (list a) 의 각 항목에 1 을 더해서 2 를 만들어 낸다.

좀 더 긴 목록으로....


	(setq a '(1 2 3 4 5 6 7 8 9 10))
	(mapcar '1+ a)

이 것은 아래와 같은 값을 반환한다.


	(2 3 4 5 6 7 8 9 10 11)

Just a few words on creating lists in AutoLisp 은 매우 간단한 명령어로 목록을 만드는데...이 리스트를 만드는 두가지 방법이 있다. 첫번째는 (getpoint) 와 (entget) 처럼 목록을 생산하는 명령어를 이용하는 것이다. 이 두 명령어는 목록을 반환한다.


두번째는 (list) 를 이용하는 것이다. 예를 들어:


	(setq a (list 1 2 3 4 5))

변수 a 는 아래와 같은 값이다.


	(1 2 3 4 5)

다른 방법은 아래와 같이 표현되는 것이다.

	(setq a '(1 2 3 4 5))

두 방법은 모두 동일한 목록을 기록한다.


여기 다시 또 다른 방법인 (mapcar) 가 있다.


변수 arglist. 에 저장되는 목록이 있다.


(setq arglist '(12.0 145.8 67.2 "M20"))

당신이 목록의 각 각 내용을 역시 각기 다른 변수에 넣고 싶다면 아래와 같은 방법이 있다.


   (setq a (nth 0 arglist))
   (setq b (nth 1 arglist))
   (setq c (nth 2 arglist))
   (setq d (nth 3 arglist))

이 일은 작동하기는 하나, 매우 느리다. 이 경우 확실히 더 나은 방법은  MAPCAR 를 이용하는 것이다.


(mapcar 'set '(a b c d) arglist)

목록의 두번째 항목을 첫번째 항목의 변수로 각각 적용하는데 일반적인 SETQ 대신 SET 기능이 사용되었다.

만약 외부파일에서 목록을 읽는 다면, 문자열로 읽히게 된다. 예를 들어

목록이  아래와 같이 보여야 하는데...


	(10 20 30 40 50)

그러나, 파일로 부터 목록을 읽게 되면, 아래와 같이 보이게 된다.


	("10" "20" "30" "40" "50")

이 경우 (mapcar) 를 이용해서 쉽게 정수로 변환가능하다.


	(setq b (mapcar '(atoi) thelist)) 

이제 이 함수를 잘 이해했으리라 생각한다. 그러나, 이제 이 (mapcar) 를 이용해서 어떻게 기능과 엮는지를 익혀야 한다.

Radians로 변경을 원하는 각도들이 있다면...


 (setq c '(23.0 47.8 52.1 35.6))

먼저 이 들 사이를 변환시키는 명령어를 만들어야 한다.:


(defun dtr (a)

	(* pi (/ a 180.0))
)

그런 후 아래와 같이 변화시키면 된다.

	(setq d (mapcar 'dtr c))

만들어진 (dtr) 명령어는 c 목록의 각각의 요소에 적용되었다. 

이 기능은 아래와 같이 사용될 수 도 있다.


	(setq d (mapcar (quote dtr) c))

(lambda)

이제 (lambda) 를 알아보자.  (lambda) 는 위와 같은 경우 (dtr) 명령어를 만들지 않고, 같은 구문에서 (mapcar) 의 기능을 수행할 수 있게 한다.


	(setq d (mapcar (quote (lambda (a) (* pi (/ a 180.0)))) c))

또는

	(setq d (mapcar '(lambda (a) (* pi (/ a 180.0))) c))

이 기능은 각도들을 라디안으로 변경하게 하고, 변수 d 에 저장하게 한다.

(lambda) 기능을 잘게 쪼개서 살펴보자.


	(lambda (a) (* pi (/ a 180.0)))

는 아래와 같다.


	(defun (a) (* pi (/ a 180.0)))

아래 명령어를 실행해 보자.


(defun c:test ()
	(setq c '(23.0 47.8 52.1 35.6))
	(setq d (mapcar '(lambda (a) (* pi (/ a 180.0))) c))
	(mapcar 'set '(w x y z) d)
   (princ)
)

!c 는 (23.0 47.8 52.1 35.6)
!d 는 (0.401426 0.834267 0.909317 0.621337)
!w 는 0.401426
!x 는 0.834267
!y 는 0.909317
!z 는 0.621337

을 각각 반환한다.


AutoCad 사용자 설명서를 인용 :


"새로운 함수를 정의하고자 하지 않을 때 (람다) 함수를 사용한다. 또한 프로그래머의 의도가 보다 명확이 사용되고자 할 때 사용되기도 한다."

예를 들어 (lambda) 는 빠른 기능 역할을 하고 싶은 어디든 사용될 수 있고, 또한 새로운 (defun) 명령어를 탑재함으로써 발생되는 문제점을 해소하고 싶을 때도 사용할 수 있다.


위의 예제와 별도로 목록에 기능을 부여하는 AutoLisp 명령어로 (apply) 와 (foreach)가 있다. 이 것을 살펴보자.

(apply)

이 기능은  (mapcar) 와는 달리 목록 속의 전체 요소에 영향을 미친다. 두가지 예제가 있다.


	(apply '+ '(1 2 3))

이 예제는 6 을 반환한다..


	(apply 'strcat '("a" "b" "c"))

이 예제는 "abc" 를 반환한다.

(apply) 를 (lambda) 와 함께 사용할 수도 있다.


	(apply '(lambda (x y z)
		(* x (- y z))
		)
		'(5 20 14)
	)

이 것은 30을 반환한다. (20-14*5=30)

(foreach)

이 명령어는 다름과 같은 구성을 가져야 한다.: (foreach name list expression…)


이 기능은 목록의 요소들을 하나씩 꺼내서 사용하는 개념이다.


	(foreach n a (princ n) (terpri))

아래와 같은 목록에 적용한다면  :


	(setq a (1 2 3 4 5))

아래와 같은 결과를 반환한다.


	1
	2
	3
	4
	5


이제 이 것들을 사용해서 즐기는 것만 남았다.

---------------------------------------------------------------

(setq curlst '("a" "b" "c" "d"))
(setq delst '("a" "b"))

(vl-remove-if '(lambda (x) (car (member x delst))) curlst)

리턴은 ("c" "d")

---------------------------------------------------------------



 

'CAD > Lisp' 카테고리의 다른 글

SSGET 사용법 정리  (0) 2014.11.07
리스트에서 순서 뽑기 기초  (0) 2014.10.27
(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11
소실된 SHX 파일 퍼지  (0) 2014.09.08


 
;;
;; entmake 시 요구리스트 정리, 출처 : http://www.theswamp.org/index.php?topic=4814.0
;; *** : 필수리스트

(entmake (list (cons 0 "3DFACE") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 11 (list 1.0 0.0 0.0)) ;***
               (cons 12 (list 0.0 1.0 0.0)) ;***
               (cons 13 (list 1.0 1.0 0.0)) ;***
               (cons 39 0.0)
               (cons 62 256)
               (cons 70 0)))

(entmake (list (cons 0 "ARC") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 40 1.0) ;***
               (cons 50 0.0) ;***
               (cons 51 1.57079633) ;***
               (cons 62 256)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "ATTDEF") ;***
               (cons 8 "0")
               (cons 10 (list 0 0 0)) ;***
               (cons 40 1) ;***
               (cons 1 "") ;***
               (cons 3 "") ;***
               (cons 2 "TEST") ;***
               (cons 70 0)
               (cons 73 0)
               (cons 50 0)
               (cons 41 1)
               (cons 51 0)
               (cons 7 "STANDARD") ;***
               (cons 71 0)
               (cons 72 0)
               (cons 11 (list 0 0 0)) ;***
               (cons 210 (list 0 0 1))
               (cons 74 0)
               (cons 62 256)
               (cons 39 0)
               (cons 6 "BYLAYER")))

(entmake (list (cons 0 "CIRCLE") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 40 1.0) ;***
               (cons 62 256)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "INSERT") ;***
               (cons 2 "LEG6") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 41 1.0)
               (cons 42 1.0)
               (cons 43 1.0)
               (cons 44 0.0)
               (cons 45 0.0)
               (cons 50 0.0)
               (cons 62 256)
               (cons 70 0)
               (cons 71 0)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "INSERT") ;***
               (cons 8 "0")
               (cons 66 1) ;***
               (cons 2 "CPD") ;***
               (cons 10 (list 0 0 0)) ;***
               (cons 41 1)
               (cons 42 1)
               (cons 50 0)
               (cons 43 1)
               (cons 70 0)
               (cons 71 0)
               (cons 44 0)
               (cons 45 0)
               (cons 210 (list 0 0 1))
               (cons 62 256)
               (cons 39 0)
               (cons 6 "BYLAYER")))

(entmake (list (cons 0 "ATTRIB") ;***
               (cons 8 "0")
               (cons 10 (list 0 0 0)) ;***
               (cons 40 1) ;***
               (cons 1 "TESTING 123") ;***
               (cons 2 "TAGNAME") ;***
               (cons 70 0)
               (cons 73 0)
               (cons 50 0)
               (cons 41 1)
               (cons 51 0)
               (cons 7 "STANDARD") ;***
               (cons 71 0)
               (cons 72 0)
               (cons 11 (list 0 0 0)) ;***
               (cons 210 (list 0 0 1))
               (cons 74 0)
               (cons 62 256)
               (cons 39 0)
               (cons 6 "BYLAYER")))

(entmake (list (cons 0 "SEQEND") ;***
               (cons 8 "0")))

(entmake (list (cons 0 "LINE") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 11 (list 0.0 1.0 0.0)) ;***
               (cons 39 0.0)
               (cons 62 256)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "POLYLINE") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 40 0.0)
               (cons 41 0.0)
               (cons 62 256)
               (cons 66 1)
               (cons 70 0)
               (cons 71 0)
               (cons 72 0)
               (cons 73 0)
               (cons 74 0)
               (cons 75 0)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "VERTEX") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 40 0.0)
               (cons 41 0.0)
               (cons 42 0.0)
               (cons 50 0.0)
               (cons 70 0)
               (cons 71 0)
               (cons 72 0)
               (cons 73 0)
               (cons 74 0)
               (cons 62 256)))

(entmake (list (cons 0 "VERTEX") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 1.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 40 0.0)
               (cons 41 0.0)
               (cons 42 0.0)
               (cons 50 0.0)
               (cons 70 0)
               (cons 71 0)
               (cons 72 0)
               (cons 73 0)
               (cons 74 0)
               (cons 62 256)))

(entmake (list (cons 0 "SEQEND") ;***
               (cons 8 "0")))

(entmake (list (cons 0 "POINT") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 50 0.0)
               (cons 62 256)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "SOLID") ;***
               (cons 6 "BYLAYER")
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 11 (list 1.0 0.0 0.0)) ;***
               (cons 12 (list 0.0 1.0 0.0)) ;***
               (cons 13 (list 1.0 1.0 0.0)) ;***
               (cons 39 0.0)
               (cons 62 256)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "TEXT") ;***
               (cons 1 "") ;***
               (cons 6 "BYLAYER")
               (cons 7 "STANDARD") ;***
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 11 (list 0.0 0.0 0.0)) ;***
               (cons 39 0.0)
               (cons 40 1.0) ;***
               (cons 41 1.0)
               (cons 50 0.0)
               (cons 51 0.0)
               (cons 62 256)
               (cons 71 0)
               (cons 72 0)
               (cons 73 0)
               (cons 210 (list 0.0 0.0 1.0))))

(entmake (list (cons 0 "TRACE") ;***
               (cons 6 "BYLAYER") ;***
               (cons 8 "0")
               (cons 10 (list 0.0 0.0 0.0)) ;***
               (cons 11 (list 0.0 1.0 0.0)) ;***
               (cons 12 (list 1.0 0.0 0.0)) ;***
               (cons 13 (list 1.0 1.0 0.0)) ;***
               (cons 39 0.0)
               (cons 62 256)
               (cons 210 (list 0.0 0.0 1.0))))


'CAD > Lisp' 카테고리의 다른 글

리스트에서 순서 뽑기 기초  (0) 2014.10.27
(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11
소실된 SHX 파일 퍼지  (0) 2014.09.08
아이소매트릭 글자 만들기  (0) 2014.09.08

켜 생성

2014.10.11 21:04

http://www.cadtutor.net/forum/showthread.php?65302&p=447101&viewfull=1#post447101

'CAD > Lisp' 카테고리의 다른 글

(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11
소실된 SHX 파일 퍼지  (0) 2014.09.08
아이소매트릭 글자 만들기  (0) 2014.09.08
치수문자 리셋  (0) 2014.09.08

소실된 SHX 파일 퍼지

2014.09.08 23:12

AutoLISP: Purge Missing SHX files

If you have drawings that are constantly missing SHX (shape) files, the routine posted below is now your friend.

The routine was posted in the LISP forum at CADTutor at the following link. Please refer questions there.
http://www.cadtutor.net/forum/showthread.php?37306-remove-unknown-SHX-files&highlight=delete+shape+files

Here’s how:

  • PSHX <enter>

The result in the command line will show how many unresolved shape files were removed from the drawing.

Missing SHX 1Missing SHX2Thanks for sharing this routine Kheylan


PSHX.lsp


'CAD > Lisp' 카테고리의 다른 글

(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11
소실된 SHX 파일 퍼지  (0) 2014.09.08
아이소매트릭 글자 만들기  (0) 2014.09.08
치수문자 리셋  (0) 2014.09.08

AutoLISP: Easily Make Isometric Text

If you need to create isometric text  and you are tired of using so many different styles, today’s tip will be your new best friend. Note that this routine only works with DTEXT (single line text).

Here’s how:

  • ISOTEXT <enter>
  • Select the DTEXT object
  • Hit the Tab button to tab through the various isometric slants until you have found the correct one.
  • Once the text looks correct, hit enter
  • Re-position the text accordingly

~enjoy


'CAD > Lisp' 카테고리의 다른 글

(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11
소실된 SHX 파일 퍼지  (0) 2014.09.08
아이소매트릭 글자 만들기  (0) 2014.09.08
치수문자 리셋  (0) 2014.09.08

치수문자 리셋

2014.09.08 22:44

AutoLISP: Reset Selected Dimensions

Now that you have located “dodgy” dims in a drawing, you may need to reset them to their original values. There are many LISP routines online that do this globally, but you may need to reset a few of these dimensions. That’s where this routine comes in handy. Instead of doing this manually, this routine does the hard work for you.

BTW, To do this manually, you select the dimension and then in the properties palette, under the text override text-box you enter <>

Here’s how:

  • RDD <enter> to start Reset Dodgy Dims
  • Select the dimensions that you want reset.
  • <enter> to finish

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;RDD Reset Dims to actual value
 
(defun C:RDD (); (c) 2001 Andy Leisk
 
(prompt "\nRDD to start...\n")
 
(princ "Selects dims to reset...\n")
 
(setq ss (ssget))
 
(command ".DIM1" "NEW" "<>" ss "")
 
(princ)
 
)
 
(princ)


'CAD > Lisp' 카테고리의 다른 글

(mapcar) 와 (lambda)  (0) 2014.10.25
Entmake 할 때, 객체별 요구리스트 정리  (0) 2014.10.25
켜 생성  (0) 2014.10.11
소실된 SHX 파일 퍼지  (0) 2014.09.08
아이소매트릭 글자 만들기  (0) 2014.09.08
치수문자 리셋  (0) 2014.09.08

+ Recent posts