레이블이 auto Lisp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 auto Lisp인 게시물을 표시합니다. 모든 게시물 표시

2013년 7월 10일 수요일

재귀 호출 함수

;;;a와b 사이의 수들을 모두 더한다.
(defun sum_i(a b) 
   (if (> a b)
      0
      (+ a (sum_i (+ a 1) b))
    )
)


2013년 7월 3일 수요일

auto lisp 문자열을 특정 구분자로 분리후 리스트로 반환

(defun string_split (string pattern / n value str char)
  (setq n 1)
  (setq value (list))
  (setq str "")
  (repeat (1+ (strlen string))
    (setq char (substr string n 1))
    (if (or
 (= char pattern)
 (> n (strlen string))
)
      (progn
(setq value (append value (list str)))
(setq str "")
      )
      (setq str (strcat str char))
    )

    (setq n (1+ n))
  )
  value
)

2013년 6월 24일 월요일

auto Lisp

오토 리습 객체 관련 함수


캐드 화면상에서 객체 선택을 요청하고 선택한 객체의 정보 (DXF 코드)를 커멘드 창에 출력한다.
( entget ( ssname ( ssget ) 0))

자동 리스프 중 빈번히 쓰이면서 유용한 함수들을 포함하는 예제 다.
선택한 객체의 DXF 코드 중 62 번의 값을 3으로 변경하는 함수 (색 변경)
( defun는의 colorchange ()
  ( setq sset ( ssget ))
  ( setq N 0)
  ( 반복 ( sslength의 sset)
  ( setq SNAME ( ssname의 sset의 N))
  ( setq의 ENT ( entget의 SNAME))
  ( entmod ( SUBST ( 죄수 62 3) ( ASSOC 62 ENT) ENT))
( setq의 N ( 1 + N))
)
  ( 공주 역 )
  )

ssget

(setq 선택 세트 (ssget))
선택을 요청한 후 저장

(선택 세트를 setq (ssget "P"))
전에 만들어진 선택을 설정 저장

(선택 세트를 setq (ssget "L"))
마지막으로 작성된 객체를에 설정 저장

(선택 세트를 setq (ssget "W"pointlist1의 pointlist2))
선택 윈도우

(선택 세트를 setq (ssget "F"pointlist1의 pointlist2))
팬스

(선택 세트를 setq (ssget "WP"pointlist1의 pointlist2))
다각형

(setq 선택 세트 (ssget "X"))
모든

(setq 선택 세트 (ssget "I"))
pickfirst 값이 활성 (1) 일 경우 해당 선택 후 명령


ssget 필터

(선택 세트 setq (ssget '((0. "텍스트"))))
유저에 선택을 요청하며 텍스트 만 선택 할수 있음

(선택 세트 setq (ssget "P" '((0. "선"))))
에서 라인을 설정 이전 만

(선택 세트 setq (ssget "W"PT1의 PT2 '((8. "floor9"))))
포인트리스트 윈도우 선택 층 "floor9"

(선택 세트를 setq (ssget "X" '((0. "원"))))
도면에있는 모든 원 선택

(선택 세트를 setq (ssget "I" '((0. "라인") (62. 5))))
선택된 객체 중 색상이 5 (파랑) 값을 가지는 라인


ssget 관계 연산자 (관계 연산)

(ssget "X" '((0. "원") (-4. "> =") (40. 2)))
정수, 실수, 포인트, 백터 (?)의 경우 관계 연산이가는하다.


ssget 논리 연산

(ssget "X" '((-4. "<OR")
                       (-4. "<AND") (0. "ciecle") (40. 1) (-4. "AND>")
                  (-4. "OR>")))

(setq <또는 '(-4. "<OR") or>'(-4."OR> "))
(ssget "X"(목록 '(0. "원") <or는 최고 기간 도중 '(40. 30) '(40. 90) or>))
필터리스트 표현주의


nentsel???
(setq 응답 
 (+; 추가
 (* (자동차 (n 번째 0 매트릭스)) (CADR의 edata)), M00 * X
 (* (자동차 (n 번째 1 매트릭스)) (caddr의 edata)), M10 * Y
 (* (자동차 (n 번째 2 매트릭스)) (cadddr의 edata)), M20 * Z
 (차 (n 번째 3 행렬)); M30
 )
)


도를 라디안으로 변환

(defun는 학위 -> 라디안 (numberOfDegrees) 
(* PI (/ numberOfDegrees 180.0)))

Converts dataType

(atof string) 문자열 -> 실수
(atoi string) 문자열 -> 정수
(itoa int)    정수 -> 문자열


Converts unit

(cvunit value from-unit to-unit)

Command: (cvunit 1 "minute" "second")
60.0
Command: (cvunit 1 "gallon" "furlong")
nil
Command: (cvunit 1.0 "inch" "cm")
2.54
Command: (cvunit 1.0 "acre" "sq yard")
4840.0
Command: (cvunit '(1.0 2.5) "ft" "in")
(12.0 30.0)
Command: (cvunit '(1 2 3) "ft" "in")
(12.0 24.0 36.0)

잘 안쓰는의 AutoLISP

(acad_colordlg colornum [flag] )
color선택 대화상자를 띄운다.
선택색상의 번호 리턴
colornum = 창이열렸을떼 기본값
flag = nil 일경우 byBlock, byLayer비할성화

 




(acad_strlsort list) 
알파벳순으로 정렬

 



(grdraw from to color [highlight])
두점을 연결하는 백터를 그린다.
라인이아님. 



(grvecs vlist [trans]) 
grdraw와 비슷.





2012년 5월 29일 화요일

디맨션 코드

10 = 치수선 위치
13 = 치수선 지시선 시작(지적위치)
14 = 치수선 지시선 끝
1 = 문자재지정
42 = 측정문자

2012년 4월 10일 화요일

입력함수







getpoint <pt> [prompt]
      이 함수는 하나의 점을 입력하도록 대기한다. 인수인 점 Pt는 현재의 UCS내의 2D 또는 3D 좌표이다. 출력좌표는 3D 점이다.
       (setq pt1 (getpoint) )
       (setq pt1 (getpoint "Pick a point : "))

인수 pt가 있으떤 고무밴드 라인을 표시한다.
    (setq pt2 (getpoint pt1 "Pick a point : "))
    (setq pt2 (getpoint'(3.0 5.5) "Pick a point : "))

Program

  MGETPT.LSP

  프로그램 기능
이 프로그램은 화면에 여러 개의 점을 적으며 모든 점에 대한 3D 좌표 list를 출력 시킨다.

  프로그램 LIST
      (defun c:MGETPT (/ point pl )
         ( whi le
                (setq point (getpoint "\n Pick point" ) )
                (setq pl (append pl (list point) ))
         )
        (princ "\n-- List of points --" )
        (terpri)
        (princ pl )
        ( princ )
     )
     ,,:
getreal [prompt]
      이 함수는 실수를 입력하도록 대기하고 그 실수를 출력한다
   (setq real (getreal ) )
   (setq real (getreal "Enter length of line : ") )

getstring [cr] [prompt]
      이 함수는 문자열을 입력하도록 대기하고 그 문자열을 출력한다.
   입력할 최대문자수는 132자이다. 이것을 초과하면 132자에서 문자열이 끊긴다. 문자열에 '\'를 입력하면 두 개의 "\\"로 변환되는데 이것이 출력되어 다른 함수가 사용할 file명 Path를 포함할 수도 있으므로 그렇게 된다.

    cr이 주어지고 그 값이 nil이면 문자열에 공백을 넣을 수 있다. (그래서 반드시 앤터로 끝나야 한다. ) 그렇지 않으면 입력 문자열은 스페이스바나 엔터에 의해 종료된다. 또한, 사용자가 입력할 키워드를 미리 정해 둘 경우에는 getkword함수를 써야 한다

      (setq str ("getstring "Type string : ")
      입력: AutoLISP --> "AutoLISP".

      (setq str (getstring T "Type string ")
      입력: AutoLISP( spacebar)PROGRAM --> "AutoLISP PROGRAM"

          (위에서 T가 없으면 (spacebar)부분에서 입력이 종료되어 버린다. )

      (setq str (getstring "Enter file name to load : ")
      입력 :\ACAD12\PRJT05\TPIPE --> "\\ACAD12\\PRJT05\\TPIPE"


getdist [pt] [Prompt]
      이 함수는 길이를 입력하도록 대기하고 입력한 길이 또는 두 점간의 길이를 계산하여 출력한다. 점 Pt가 주어지면 화면에 고무밴드 라인이 나타나며, pt는 현재의 UCS내의 2D 또는 3D 점이다.
      init함수에 64비트를 설정하면 z좌표값은 무시되고 20거리를 출력할 수 있다.

     (setq dist (getdist) ) "
     (setq dist (getdist pt1 ) )"
     (setq dist (getdist "Pick or Enter distance : "))"
     (setq dist (getdist pt1 "Pick endpoint : ") )"

getcorner <pt> [prompt]
      getpoint처럼 한 점을 출력하는 것은 같으나 다른 점은 다음과 같다.
        1. 인수 Pt가 있어야 한다.
       2. Pt점에서부터 사각형 틀이 표시된다.

getorient [pt] [prompt]
      이 함수는 getangle파 같은 기능을 한다.
다만 다음 사항이 다르다.
    1. 출력되는 각도가 시스템변수 ANGBASE(0도 지점)와 ANGDIR(각도증가 방향)의 영향을 받지 않는다.
    2. ANGBASE와 ANGDIR의 값이 어떻든지 getorient는 항상 radian 0도 지점을 오른쪽(동쪽,3시방향)에 두고 각도 증가는 시계반대 방향으로 각도를 잰다. (AutoCAD 사용자는 UNITS명령으로 일반적으로 이와 같이 설정해 놓고 있다. ) 입력 각도와 getorient로 출력되는 각도는 서로 다르다
    3. getorient에 의해 각도를 입력할 때는 ANGBASE와 ANGDIR의 현재 값을 기준으로 한다.
     4, 그러나 일단 입력된 각도는 ANGBASE와 ANGDIR의 현재 값을 무시하고 위의 2번항과 같이 잰다

그래서 사용자가 UNITS명령이나 시스템변수 ANGBASE와 ANGDIR을 사용해서 0도지점과 각도 증가 방향을 바꾸면 약간의 변환 과정을 거쳐야 한다.
절대각도인 entity가 진행할 방향각을 구하기 위해서는 getangle을 사용하는 반면 상대각도인 rotate각도를 입력할 때는 getorient를 사용해야 한다.

getkword [prompt]
      사용자가 키워드를 입력하도록 대기하며, 키워드 리스트는 getkword를 호출하기 전에 initget함수를 사용하여 설정해 놓아야 한다. 이 함수는 사용자가 입력한 문자열에 부합되는 키워드를 출력한다. 키워드에 없는 문자열은 무시되며 null입력이 허용되면 null은 nil로 출력된다. 키워드가 전혀 설정되어 있지 않으면 nil이 출력된다.
       ( initget 1 "YES NO")
       (setq ans (getkword "Answer (YES/NO) : ") )

initget [bits] [string]
      이 함수는 다른 함수가 사용할 여러 가지의 option을 사전에 설정해 주고 항상 nil을 출력한다. initget을 사용하는 함수는 다음과 같다.
        getxxx (단, getstring, getenv, getvar는 제외)
        entsel nentsel nentselp
  인수 bits는 정수로서 다음과 같다.

     INITGET함수 BIT코드표
-------------------------------------------------------------------------------
   bits            의미
-------------------------------------------------------------------------------
1               null입력을 허용치 않는다.
2               0인 값을 허용치 않는다.
4               음수 값을 허용치 않는다.
8               LIMCHECK가 ON상태에서도 설계 한계점을 검사하지 앉는다.
16             (현재 사용하지 않는다. )
32             고무밴드라인이나 박스를 dashed line 으로 표시 한다.
64             getdist에 한해 3D의 Z좌표를 무시한다.
128             임의 키보드입력을 허용한다.
 -------------------------------------------------------------------------------

getint [prompt]

   이 함수는 사용자의 정수 입력을 대기하고 그 정수를 출력한다.
정수범위는 -32,768 - 32,768이다.

Program

AUTONUM.LSP

프로그램 기능
   지정한 길이 내에 지정한 숫자들을 순서대로 배열한다

프로그램 LIST
    (defun c:AUTONUM (/ SNO ENO PT DIST ANG HGT NO STR)
             ( setq SNO (getint "\n>>> Starting number: " ) )
             (setq ENO (getint "\n>>> Ending number: " ) )
             ( setq PT (getpoint "\n>>> from point; " ) )
             ( setq DIST '(getdist PT "\n>>> Distance between numbers: "
             (setq ANG (getangle PT "\n>>> Angle for array/<0>: " ) )

           (if (: ANG nil) (setq ANG 0))
           (setq HGT (getdist PT "\n>>> Text height, " ) )
           (if (> SNO ENO)
                 (setq NO -1 )
                 (setq NO 1)

           )::if
           (repeat (+ 1 (abs (- SNO ENO)))
                 (setq STR ( itoa SNO) )
                 (command "text" "s" "standard" PT HGT ANG STR)
                 (setq SNO (+ SNO NO))
                 (setq PT (polar PT ANG DIST) )
           ) : : repeat
           ( princ )

프로그램 설명
    ( setq SNO (getint "\n>>> Starting number: " ) )
    (setq ENO (getint "\n>>> Ending number " ) )
계산을 위한 숫자가 아니므로 문자열로 입력받는다.

     (setq PT (getpoint "\n>>> from point: ") )
 점을 입력하면 그 점의 3차원 좌표(x,y,z)가 PT에 저장된다.
     ( setq DIST (getdist PT "\n>>> Distance between numbers: " ) )
getdist에 인수 PT를 붙이면 고무밴드 drag line이 나타난다.
     ( setq ANG (getangle PT "\n>>> Angle for array numbers<0>: " ) )
getangle에도 인수 PT를 붙이면 고무밴드 drag line이 나타난다.
     (if (: ANG nil) (setq ANG 0))
각도를 입력하지 않으면 즉 ENTER를 누르면 0도로 한다.
     (setq HGT (getdist PT "\n>>> Text height, " ) )
text의 높이 입력은 getdist를 사용한다.
     (if (> SNO ENO)
if조건 문으로서 시작 숫자가 종료 숫자보다 클 때,
( i f-then-el so )
           (setq NO -1 )
           (setq NO 1)
변수 NO를 -1로 설정하고 (then)
그렇지 않으면 변수 NO를 -1로 설정한다. (else)
     (repeat (+ 1 (abs (- SNO ENO)))
repeat반복문이 다.
반복 횟수는 두 개의 숫자를 뺀 숫자를 절대값으로 만든 후에 1을 더한 수가 된다.
           (setq STR ( itoa SNO) )
정수 SNO를 문자열로 변환시킨다.

           (command "text" "s" "standard" PT HGT ANG STR)
입력된 data와 계산한 결과로 text명령을 실행한다.
          (setq SNO (. SNO NO))
매 번 숫자가 증가되도록 한다.

           (setq PT (polar PT ANG DIST) )
PT를 재 정의하여 숫자의 위치가 매번 규칙적으로 변경되도록 한다.


Program
ANGDIS.LSP

프로그램 기능
   지정한 두 점간의 각도와 거리를 화면에 출력한다.

프로그램 LIST

(defun c:ANGDIS ( / pt1 pt2)
    (setq pt1 (getpoint "\nFirst point: " ) )
    (setq pt2 (getpoint "\nSecond point: ") )
    (setq ang (angle pt1 pt2) )
    (princ "\nAngle(degree) " )
    (princ (* (/ ang pi) 180.0))
    (setq dist (distance pt1 pt2) )
    (princ " Distance :")
    (princ dist )
    ( princ )
)


프로그램 설 명
         (setq pt1 (getpoint "\nFirst point: " ) )
         (setq pt2 (getpoint "\nSecond point: " ) )
점좌표값을 pt1 , pt2에 저장한다.

         (setq ang (angle pt1 pt2) )
pt1에서 pt2로 향한 radian각도를 재어 ang에 저장한다.

          (princ "Angle(degree) : " )
command line에 Angle이 표시된다.

         (princ (* (/ ang pi) 180.0))
radian각도를 degree단위로 변환시켜 화면에 나타낸다.

         (setq dist (distance pt1 pt2) )
두 점간의 거리를 재어 dist에 저장한다.

         (princ " Distance :")
         (princ dist)
거 리 를 표시 한다.



Program

MCIRCLE.LSP

프로그램 의 기능
   이 프로그램은 지정한 지름을 가진 원을 지정한 수량만큼 지정된 위치에 그린다

프로그램 리스트
    (defun C:MCIRCLE (/ NO DIA MUL CEN)
       (setq NO (getint "\n Number of circle: " ) )
       (setq DIA (getdist "\n Diameter of circle (pick or type) : "))
       (if (: DIA nil)
             (setq MUL MUL)
             (setq MUL DIA)
       )::if
       ( repeat NO
           (princ "\n Diameter of circle (pick or typel'")
           (princ MUL)
           (setq CEN (getpoint "\n Center-point of circle (pick or type) : "))
           (command ^Circle" CEN "d" MUL)
       ) : : repeat
    ): :defun
    ::;

프로그램 설 명
        (setq NO (getint "\n Number of circle: " ) )
그리고자 하는 원의 개수(NO)를 정수로 입력받는다. (get integer)
       (setq DIA (getdist ")sn Diameter of circle (pick or type) : "))
원의 지름을 입력 대기한다. (get distance)
       (if (: DIA nil)
             ( setq MUL MUL)

             (setq MUL DIA)
원을 두 개째 그릴 때는 이미 입력한 DIA를 사용한다.
       ( repeat NO
다음 과정을 개수 NO만큼 반복 수행(repeat)한다.
            (princ "\n Diameter of circle (pick or type) : ")
            (princ MUL)
지름의 현재 값을 출력한다. 프로그램이 가지고 있는 MUL을 내놓는다.
이 MVL을 NO횟수만큼 내놓아서 연속해서 원을 그릴 수 있도록 해준다.
    (setq CEN (getpoint "\n Center-point of circle (pick or type) :

                                                                                    "))
원의 중심점을 입력 대기한다.

            (command ^Circle" CEN "d" MUL)


AUTOCAD의 circle명령으로 NO횟수만큼 원을 그릴 수 있다.


Program

PBOX.LSP

프로그램의 기능
   이 프로그램은 pline으로 box를 그린다.

프로그램 리스트
    (defun DTR (a)
          (* pi (/ a 180.0))
    )
    l inriiipnnii#ifiiiiuuiiiinHiilitnpfiriiHniu

    (defun C: PBOX (/ pt1 p xlen ylen)
       (setq pt1 (getpoint "\n Start point of Pline box: ") )
       (setq xlen (getdist pt1 "\n x-length of Pbox (Pick or Type) : '
       (setq ylen (getdist pt1 "\n y-length of Pbox (Pick or Type) : '
       (setq pt2 (polar pt1 0 xlen) )
       (setq ptS (polar pt2 (dtr 90) ylen) )
       (setq pt4 (polar ptS (dtr 180) xlen)
      (command "pl me" pt1 pt2 pt3 pt4 ^Close")
      (command "rotate" "1· ". pt1) : 1=last
      ( terpri )
      ( princ "\n‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ )
      (princ "\n x-length of Pbox : ")
      (princ xlen)
      (princ "\n y-length of Pbox : ")
      (princ ylen)
      (princ )
   )
   :::

프로그램 설명
    (defun DTR (a)
           (* pi (/ a 180,0))
    )

degree각도를 radlian으로 변환시키는 프로그램이다.
        (setq pt1 (getpoint "\n Start point of Pline box: ") )
점을 pick하면 pt1에는 좌표값이 저장된다.
        (setq xlen (getdist pt1 "\n x-length of Pbox (Pick or Type): ") )
        (setq ylen (getdist pt1 "\n y-length of Pbox (Pick or Type): "))
getdist 다음에 좌표값을 가진 pt1을 두면 화면에 고무밴드 drag line이 나타난다.
         (setq pt2 (polar pt1 0 xlen))
         (setq ptS (polar pt2 (dtr 90) ylen) )
         (setq pt4 (polar pt3 (dtr 180) xlen)
Polar함수가 출발점 -> 각도방향 릇 거리에 있는 점좌표를 구하여 각 변수에 저장한다.

            (command "pl me" pt1 pt2 pt3 pt4 ^Close" )
각 점좌표를 따라 pline으로 box를 그린다.

             (command "rotate" "1· ". pt1) : 1=last
그린 box를 rotate할 수 있도록 한다.
            ( terpri )
            ( princ "\n‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ )

            (princ "\n x-length of Pbox : ")
            (princ xlen)
            (princ "\n y-length of Pbox : ")
            (princ ylen)
입력한 길이 값을 화면에 나타낸다.

출처

http://amadis.selfip.com:8080/tc/amadis/category/autolisp-1?page=2

2012년 4월 4일 수요일

표준 파일선택 대화상자

getfiled
이제서야 알았다니...

2012년 4월 3일 화요일

line의 mid point


(defun c:lineMid()
  (setq selectSet(ssget))
  (setq entName(ssname selectSet 0))
  (setq ent(entget entName))

  (setq sp(cdr(assoc 10 ent)))
  (setq ep(cdr(assoc 11 ent)))
  (setq len(distance sp ep))
  (setq ang(angle sp ep))
  (setq mp(polar sp ang (/ len 2)))
 
mp
  )

선택한 라인의 중심점 찾는거

2012년 3월 31일 토요일

물량정리 LISP 만들기

배이직도면 상의 마크와 사이즈 정보 그리고 라인을이용한 물건의 길이를
txt파일로 저장한다.


베이직도면의 정보얻기
베이직도면에 명기돼는 멤버리스트를 txt파일로저장
ex)...("mark" "h400x300x8x13")

이렉션 드로잉상의 선택한 마크와 저장된 마크를 매치해서 사이즈를 파일로 쓴다.




;basic도면의 부재 싸이즈를 txt파일로
(defun c:atest (/ startPoint endPoint startPointArea
endPointArea stp2 edp2
v_len1 v_len2 v_len3 fd
file_m count pointTest areaList
xDistance xAngle sn en
)

  (setq var_osmode (getvar "osmode"))
  (setvar "osmode" 32)
  (setq pointTest nil)
  (setq areaList nil)
  (setq count 1)


  (prompt "\n한줄의 영역을 지정해주세요.")
  (setq startPoint (getpoint "\n시작점"))
  (setq endPoint (getcorner startPoint "\n두번째점"))
  (setq xDistance (distance startPoint endPoint))
  (setq xAngle (angle startPoint endPoint))



  (prompt "\n문자열이 포함된 영역을 지정해주세요")

  (while (= pointTest nil)
(setq startPointArea (getpoint "\n시작점"))

(if (/= startPointArea nil)
 (progn
(setq endPointArea (getcorner startPointArea "\n두번째점"))
(setq areaList
  (append
areaList
(append (list startPointArea) (list endPointArea))
  )
)
(setq count (+ count 1))
 )
 (setq pointTest 1)
)
  )

  (setq file_m (file_name2))

  (if (= file_m nil)
(setq file_m file_i)
(setq file_i file_m)
  )



  (setq v_len1 (abs (- (cadr startPoint) (cadr endPoint))))



  (setq sn 0)
  (setq en 1)

  (while (/= count 0)

(setq startPointArea (nth sn areaList))
(setq endPointArea (nth en areaList))
(setq v_len2 (abs (- (cadr startPointArea) (cadr endPointArea))))
(setq v_len3 (atoi (rtos (/ v_len2 v_len1) 2 0)))



(setvar "osmode" 0)

(repeat v_len3
 (setq a1 (ssget "c" startPoint endPoint '((0 . "text"))))
 (if (/= a1 nil)
(progn
 (setq fd (open file_m "a"))
 (princ (basic_mark a1) fd)
 (princ "\n" fd)
 (close fd)
)
 )
;;;선택영역에 텍스트가없으면 파일에 쓰지않음
 (setq stp2 (polar startPoint (+ pi (/ pi 2)) v_len1))
 (setq edp2 (polar endPoint (+ pi (/ pi 2)) v_len1))
 (setq startPoint
stp2
endPoint edp2
 )
)
(setq sn (+ sn 2))
(setq en (+ en 2))
(setq count (- count 1))
(if (/= count 1)
 (progn
(setq startPoint (nth sn areaList))
(setq endPoint (polar startPoint xAngle xDistance))
 )
 (setq count 0)
)
  )
  (setvar "osmode" var_osmode)
  (princ)

)


(defun basic_mark
  (a1 / num n a2 a3 a4 a5 b1 b2 b3 len_b1 len_b2 b6 b11 b22)
;;;a1~a5선택세트
;;;n 반복용
;;;len~ 길이를 이용한 정렬
;;;b~ 출력


; (setq a1(ssget "w" startPoint endPoint))
  (setq num (sslength a1))
  (setq n 0)

  (repeat 2

(setq a2 (ssname a1 n))
(setq a3 (entget a2))
(setq a4 (assoc 1 a3))
(setq a5 (cdr a4))

(if (= n 0)
 (setq b1 a5)
 (setq b2 a5)
)

(setq n (+ n 1))
  )

  (setq len_b1 (strlen b1))
  (setq len_b2 (strlen b2))
;(setq b6 nil)

  (if (> len_b1 len_b2)
(progn
 (setq b6 b1)
 (setq b1 b2)
 (setq b2 b6)
)
  )
  (setq b11 (strcat "\"" b1 "\""))
  (setq b22 (strcat "\"" b2 "\""))
  (setq b3 (list b11 b22))
)
;;;선택세트에서 문자열을 정리해서 리턴

(defun file_name2 (/ path_m name_m file_m) ;

;(setq path_m "c:/hello/")
  (setq path_m "C:/hmgTXT/")
  (setq name_m (getstring "\n파일이름을 입력하세요."))
  (if (= name_m "")
(setq file_m nil)
(setq file_m (strcat path_m name_m ".txt"))
  )

  file_m

)



;;;파일에서 읽어온문자를 도면의 글자와 대치해서 삽입

(defun c:etest (/ selectObjectSet
entname ent   num
n entTextvalueList
insertPoint textAngle   blockinsertPoint
entTextvalue markSize   file_m thelist
dcl_id selectFilevalue listboxValue listBoxtest
)

  (vl-load-com)
  (setq val_dimscale (getvar "dimscale"))
  (setq val_cmdho (getvar "cmdecho"))
  (setq val_attdia (getvar "attdia"))
  (setvar "attdia" 0)
  (setq val3 (/ val_dimscale 2))

  (setvar "cmdecho" 0)

  (setq thelist (vl-directory-files "C:/hmgTXT/" "*.txt" 1))

  (setq dcl_id (load_dialog "basicMarkFile.dcl"))


  (if (not (new_dialog "basicMarkFile" dcl_id))
(exit)
  )

  (start_list "selectFile")
  (mapcar 'add_list thelist)
  (end_list)

  (action_tile "cancel" "(setq listBoxtest 1) (done_dialog)")
  (action_tile
"accept"
"(setq listboxValue (atoi(get_tile \"selectFile\")))(done_dialog)"
  )


  (start_dialog)
  (unload_dialog dcl_id)
  (if (/= listBoxtest nil)
(exit)
(progn

  (setq selectFilevalue (nth listboxValue thelist))


  (setq file_m (file_name3 selectFilevalue))
  (if (= file_m nil)
(setq file_m file_i)
(setq file_i file_m)
  )

  (prompt "\n선택")

  (setq selectObjectSet
(ssget) ;"<or" '((0 . "text")) '((0 . "line")) "or>"
  )
  (setq num (sslength selectObjectSet))
  (setq n 0)

  (repeat num

(setq entname (ssname selectObjectSet n))
(setq ent (entget entname))
(cond
 ((= (cdr (assoc 0 ent)) "TEXT")

  (setq entTextvalueList (assoc 1 ent))
  (setq entTextvalue (cdr entTextvalueList))

  (setq insertPoint (cdr (assoc 10 ent)))
  (setq textAngle (cdr (assoc 50 ent)))
  (setq blockinsertPoint
 (polar insertPoint
(+ textAngle (+ pi (/ pi 2)))
(+ val_dimscale (/ val_dimscale 3))
 )
  )
  (setq textAngle_t (* 180 (/ textAngle pi)))

  (setq markSize (car (edwg_mark entTextvalue file_m)))
 )

 ((= (cdr (assoc 0 ent)) "LINE")

  (setq lineStartPoint (cdr (assoc 10 ent)))
  (setq llineEndPoint (cdr (assoc 11 ent)))
  (setq lineLength
 (rtos (distance lineStartPoint llineEndPoint) 2 0)
  )
 )
)
(setq n (+ n 1))
  )
  (command "-insert" "C:/hmgTXT/basicMark/hmg_mark" blockinsertPoint
  val_dimscale textAngle_t lineLength
  markSize entTextvalue
 )
  )
)
  (setvar "attdia" val_attdia)
  (princ)
)



(defun edwg_mark (entTextvalue file_m / fd r1 r2 r3 r4 i) ;

  (setq i 0)
  (setq fd (open file_m "r"))

  (if (= fd nil)
(alert "\n존재하지 않는파일입니다.")
  )

  (while (= i 0)

(setq r1 (read-line fd))

(if (= r1 nil)
 (progn
(setq r4 (list "nothing"))
(setq i 1)
 )
 (progn
(setq r2 (read r1))
(setq r3 (car r2))
 )
)


(if (= r3 entTextvalue)
 (progn
(setq r4 (cdr r2))
(setq i 1)
 )
)

  )
  (close fd)
  r4
)


(defun file_name3 (selectFilevalue / path_m name_m file_m) ;

;(setq path_m "c:/hello/")
  (setq path_m "C:/hmgTXT/")
  (setq name_m selectFilevalue)
  (if (= name_m "")
(setq file_m nil)
(setq file_m (strcat path_m name_m))
  )

  file_m

)



;dcl은 별도로
(defun c:mtest( / a b c)
  (setq a "C:/hmgTXT/basicMark/hmg_mark.txt")
  (setq b "C:/hmgTXT/basicMark/markSizeList.txt")
  (setq c (ssget '((2 . "hmg_mark"))))
  (command "-attext" "o" c "" "s" a b)
  (princ)
  )


basicMarkFile : dialog{
label = "Basic Mark File List";
: list_box {
label = "File List";
key = "selectFile";
}


ok_cancel;
}



2012년 2월 5일 일요일

좌표를 파일로 읽고 쓰기

쓰기
(princ 좌표 파일_포인터)

읽기
(setq 변수(read(read-line 파일_포인터)

2011년 12월 12일 월요일


reverse
(reverse 리스트)
리스트를 역으로 배열하여 출력한다.

append
(append 리스트 리스트...)
리스트를 하나의 리스트로 합친다.

foreach
(foreach 변수 리스트 함수)
함수중 이름을 찾아서 리스트의 요소를 순서대로 하나씩 배당하여 실행.

nth
(nth 순차 리스트)
리스트중 지정순번+1번째값을 출력한다.

2011년 11월 25일 금요일


(defun c:test()

  (vl-load-com)

  (setq fn(getvar "savename"));;savename현제파일의 경로와 이름을 저장한다.
  (setq fd(vl-filename-directory fn));;filename에서 경로만을 취한다.(filename는 경로와 이름합치거)
  (setq fdlist(vl-directory-files fd));;지정한 경로내의 파일의 이름 리스드를 만드다.

  (setq file1(strcat fd (nth  n fdlist)))
    (princ file1)
  (princ)
  )
(vl-string->list 문자열);;문자열을 구성하는 각문자의 아스키 코드값을 리스트로 반환한다.


2011년 11월 9일 수요일


(DEFUN C:TEST()
  (SETQ A1(SSGET))
  (SETQ A2(SSNAME A1 0))
  (SETQ A3(ENTGET A2))
  (SETQ A4(ASSOC 1 A3))
  (SETQ STR(CDR A4))

  (SETQ FD(OPEN "D:/02_서브/good/TEST.TXT" "A"))
  (SETQ C1(STRLEN STR))
  (SETQ N 1)
  (REPEAT C1
    (SETQ C2(SUBSTR STR N 1))
    (SETQ C3(LIST C2))

    (PRINC C3 FD)
    (SETQ N(+ N 1))
    )
  (CLOSE FD)
  (PRINC)
  )


;;;문자열을 분리중
;;;원하는것은 선택한 문자열을 원하는데로 분리해서 리스트로 묶어서
;;;파일에 쓰는것인데...막혔다.





(DEFUN C:TEST()
  (SETQ A1(SSGET))
  (FILE_W (STRING_R A1 0))
  ;(PRINC)
  )
 

(DEFUN STRING_R(SELECTION N / ENT_NAME ENT ENT_CODE STR
             SELECTION N)
  ;;;;;객체이름,객체정보 ,지정코드 내용,문자열,선택세트,숫자
 
  (SETQ ENT_NAME (SSNAME SELECTION N))
  (SETQ ENT(ENTGET ENT_NAME))
  (SETQ ENT_CODE(ASSOC 1 ENT))
  (SETQ STR(CDR ENT_CODE))
  STR
)
;;;;;TEXT를 선택 넘겨받아서



(DEFUN FILE_W(STR / FILE_DIRECTORY STRING_LEN STRING_S N STR_LIST STR)
;;;;; 파일이름과 경로,문자열 길이,지정한위치의 문자,문자리스트,넘겨받은 문자열
  (SETQ FILE_DIRECTORY(OPEN "C:/hello/Programming/lisp/TEST.TXT" "A"))
  (SETQ STRING_LEN(STRLEN STR))
  (SETQ N 1)
  (REPEAT STRING_LEN
    (SETQ STRING_S(SUBSTR STR N 1))
    (SETQ STR_LIST(LIST STRING_S))

    (PRINC STR_LIST FILE_DIRECTORY)
    (SETQ N(+ N 1))
    )
  (CLOSE FILE_DIRECTORY)
  (PRINC)
  )
;;;C:\hello\Programming\lisp\
;;;"D:/02_서브/good/TEST.TXT"

;;;;함수단위를 나누어보았다.



2011년 11월 8일 화요일


;;;파일에서 읽어온문자를 도면의 글자와 대치해서 삽입

(defun c:ae(/ a1 a2 a3 num n a4 po1 tang ipt a5 text1 file_m);

  (setq val1(getvar "dimscale"))
  (setq val2(getvar "cmdecho"))
  (setq val3(/ val1 2))
 
  (setvar "cmdecho" 0)

  (setq file_m(file_name))
  (if (= file_m nil)
     (setq file_m file_i)
     (setq file_i file_m)
   )

  (prompt"\n 글자를 선택해주세요")
  (setq a1(ssget '((0 . "text"))))
  (setq num(sslength a1))
  (setq n 0)

  (repeat num
 
  (setq a2(ssname a1 n))
  (setq a3(entget a2))
  (setq a4(assoc 1 a3))
  (setq a5(cdr a4))
   
  (setq po1(cdr(assoc 10 a3)))
  (setq tang(cdr(assoc 50 a3)))
  (setq ipt(polar po1 (+ tang (+ pi(/ pi 2))) val1))
  (setq tang_t(* 180(/ tang pi)))
;;;----text의 삽입점과 회전추출----



  ;(setq text10(car(aaa a5)))
;;;  (setq text1(itoa(cadr(aaa a5))))
;;;  (setq text2(itoa(caddr(aaa a5))))
  (setq text1(car(edwg_mark a5 file_m)))
  ;(setq text2(aaa a5))
 ; (setq textval(strcat text1 "x" text2))
  (command "-text"  ipt val3 tang_t text1)

  (setq n(+ n 1))

 )

  (princ)
)


 
(DEFUN edwg_mark(a5 file_m / fd r1 r2 r3 r4 i);

   (setq i 0)
   (setq fd(open file_m "r"))
 
   (if(= fd nil)
      (alert "\n존재하지 않는파일입니다.")
    )

   (while (= i 0)

      (setq r1(read-line fd))

      (if (= r1 nil)
        (progn
           (setq r4 (list "000"))
  (setq i 1)
         )
(progn
  (setq r2(read r1))
           (setq r3(car r2))
         )
       )


      (if (= r3 a5)
        (progn
           (setq r4(cdr r2))
           (setq i 1)
)
       )
   
    )
   (close fd)
    r4
 )


;basic도면의 부재 싸이즈를 txt파일로



(defun c:ab( / stp1 edp1 stp10 edp10 stp2 edp2 v_len1 v_len2 v_len3 fd file_m)
;;;  stp~영역
;;;  edp~영역
;;;  v_len~선택영역교체용
;;;  fd 파일포인터
;;;  file_~파일이름
  (setq var_osmode(getvar "osmode"))
  (setvar "osmode" 33)

  (prompt"\n한줄의 영역을 지정해주세요.")
  (setq stp1(getpoint"\n시작점"))
  (setq edp1(getcorner stp1 "\n두번째점"))

  (prompt"\n문자열이 포함된 영역을 지정해주세요")
  (setq stp10(getpoint"\n시작점"))
  (setq edp10(getcorner stp10 "\n두번째점"))
 
  (setq file_m(file_name))
  (if (= file_m nil)
    (setq file_m file_i)
    (setq file_i file_m)
    )
 
;;;  파일입력시 이전 입력값 을 쓴다.
  (setvar "osmode" 0)
  (setq v_len1(abs(- (cadr stp1)(cadr edp1))))
  (setq v_len2(abs(- (cadr stp10)(cadr edp10))))
  (setq v_len3(atoi(rtos(/ v_len2 v_len1)2 0)))

  ;(while (<= (abs(cadr stp1))(abs(cadr edp10)))
  ;(while (/= rl nil)
   (repeat  v_len3
     (setq a1(ssget "w" stp1 edp1))
     (if(/= a1 nil)
        (progn
           (setq fd(open file_m "a"))
           (princ (basic_mark a1)fd)
           (princ "\n" fd)
           (close fd)
 )
       )
     ;;;선택영역에 텍스트가없으면 파일에 쓰지않음
     (setq stp2(polar stp1 (+ pi(/ pi 2)) v_len1))
     (setq edp2(polar edp1 (+ pi(/ pi 2)) v_len1))
     (setq stp1 stp2
  edp1 edp2)
     )
  (setvar "osmode" var_osmode)
  (princ)
  )
;;;text를 선택해서 파일로저장하는거

(defun basic_mark(a1 / num n a2 a3 a4 a5 b1 b2 b3 len_b1 len_b2 b6 b11 b22)
;;;a1~a5선택세트
;;;n 반복용
;;;len~ 길이를 이용한 정렬
;;;b~ 출력
                             
   ; (setq a1(ssget "w" stp1 edp1))
    (setq num(sslength a1))
    (setq n 0)

    (repeat  2
 
       (setq a2(ssname a1 n))
       (setq a3(entget a2))
       (setq a4(assoc 1 a3))
       (setq a5(cdr a4))

       (if (= n 0)
          (setq b1 a5)
          (setq b2 a5)
        )

       (setq n(+ n 1))
      )

     (setq len_b1(strlen b1))
     (setq len_b2(strlen b2))
       ;(setq b6 nil)

     (if (> len_b1 len_b2)
        (progn
           (setq b6 b1)
           (setq b1 b2)
           (setq b2 b6)
         )
      )
    (setq b11(strcat "\"" b1 "\""))
    (setq b22(strcat "\"" b2 "\""))
    (setq b3(list b11 b22))
   )
;;;선택세트에서 문자열을 정리해서 리턴

2011년 10월 24일 월요일

inters,textbox

inters 라인의 포인트를 이용해서 교차점은 얻는다.
(inters <point1> <point2><point3><point4> [flag])

flag 가nil 이면 무한상의 교차점 t 이면 아니고.


textbox <elist>
      text인 elist를 감싸는 box의 대각선 좌표를 두 점의 list로 출력한다.

2011년 10월 19일 수요일


(defun c:test()
  (setq select_set(ssget '((0 . "line"))))
  (setq setname(ssname select_set 0))
  (setq ent (entget setname))

  (setq xpon1(abs(nth 1(assoc 10 ent))))
  (setq xpon2(abs(nth 1(assoc 11 ent))))
  (setq ypon1(abs(nth 2(assoc 10 ent))))
  (setq ypon2(abs(nth 2(assoc 11 ent))))
  (setq len(rtos(distance
    (setq p2(cdr(assoc 10 ent)))
    (setq p2(cdr(assoc 11 ent)))
    )2 0))

  (if (> xpon1 xpon2)
    (setq xlen(rtos(- xpon1 xpon2)2 0))
    (setq xlen(rtos(- xpon2 xpon1)2 0))
    )

  (if (> ypon1 ypon2)
    (setq ylen(rtos(- ypon1 ypon2)2 0))
    (setq ylen(rtos(- ypon2 ypon1)2 0))
    )
  (setq p1(getpoint))
  (command "-insert" "vbal" p1 "" "" len ylen xlen)

  (princ xlen)
  (princ "\n")
  (princ ylen)

  (princ)
 )

선택한 라인의 길이를 써준다.

2011년 10월 18일 화요일

BOLT 그리기


(defun insert_bolt(bolts len bolt_d bolt_h bs / p1 p2 p3 pon1 pon2 pon3
  pon4 pon5 pon6 pon7 pon8 pon9 pon10 pon11 pon12 pon13 oldos)
  (setq oldos(getvar "osmode"))
  (setvar "osmode" 33)

  (setq p1(getpoint"\n\"첫번째점 지정\""));insert point
  (setq p2(getpoint"\n\"두번째점 지정\""));방향과 각도를 얻는다.

  (setvar "osmode" 0);그리기위해서 오스넵을 꺼둔다.

  (setq p3(angle p1 p2))

  (setq pon1(polar p1 (+ p3 (/ pi 2)) (/ bolts 2)))
  (setq pon2(polar pon1 p3 bs))
  (setq pon3(polar pon2 p3 len))
  (setq pon4(polar pon3 (- p3 (/ pi 2)) bolts))
  (setq pon5(polar pon4 (+ p3 pi) len))
  (setq pon6(polar pon5 (+ p3 pi) bs))
  (setq pon7(polar p1 p3 (+ bs len)))
  (setq pon8(polar pon7 (+ p3 (/ pi 2))(/ bolt_d 2)))
  (setq pon9(polar pon8 p3 bolt_h))
  (setq pon10(polar pon9 (- p3 (/ pi 2)) bolt_d))
  (setq pon11(polar pon10 (+ p3 pi) bolt_h))
  (setq pon12(polar pon7 p3 (+ bolt_h bolt_h)))
  (setq pon13(polar p1 (+ p3 pi) bolt_h))

  (command "color" "3" "" );볼트는 녹색
  (command "pline" pon1 pon2 pon5 pon6 pon1 "")
  (command "pline" pon2 pon3 pon4 pon5 pon2 "")
  (command "pline" pon8 pon9 pon10 pon11 pon8 "")

  (command "color" "1" "");중심선은 빨강색
  (command "line" pon13 pon12 "");center line

  (setvar "osmode" oldos)
  (command "color" "bylayer" "")

  );end



(defun c:ib();insert bolt(t.s bolt 규격참조)
  (initget 1 "16 20 22 24")
  (setq bolt_size (getkword"\n\"bolt size를 선택해주세요.(16 20 22 24)\""))
  (setq len(getint"\n\"길이를 입력해주세요.\""))
  (cond
    ((= bolt_size "16")(insert_bolt 16.0 len 27.0 10.0 15.0));볼트사이즈,길이,d(머리지름),h(머리두께),s(덜어져 나갈부분)
    ((= bolt_size "20")(insert_bolt 20.0 len 34.0 13.0 18.0))
    ((= bolt_size "22")(insert_bolt 22.0 len 39.0 14.0 19.0))
    ((= bolt_size "24")(insert_bolt 24.0 len 43.0 15.0 20.0))
    )
    (princ)
  )


규격화된 볼트를 그린다.
딴건 없고 서브 함수에 매게변수를 건네주는 것을 본격적으로 활용한것에 의의
상수와 변수 모두 잘 건네주었다.
지역변수 지정도 정상작동 돼었다.

2011년 9월 28일 수요일

2011년 9월 26일 월요일

(setq aa(open "경로" "옵션 r w a중 택")
파일을 오픈하는것인데 주의점이 경로 입력시 보통은"\"인데 "/"로 입력해야한다.
(write-line"aaa" aa)
(princ "aaa" aa)
princ 와 write-line 둘다 열려있는 파일에 쓰는것인데,
장단이 있겟지만 일단 리스트형식은 princ만 써지더라.

(close aa)
close로 닫은후에야 파일이 써지는것이다.


2011년 9월 3일 토요일

샾을위한

Column의size를 입력받아 변수로 저장하고  선택한 point에 단면을 그린다.

두번째 point 와 Col 의치수를 입력받아 단면을 그리고 선택해 저장한 두 point 사이의 거리를 구해 p/p로, 그리고 main size를 구해 그린다.

간단한 detail임에도 입력이 많아 작업이 반복대면 없으니만 못하겠다.