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;
}



댓글 없음 :

댓글 쓰기