CAFE

★ CAD/LISP/분과 Q&A

[[Lisp]]같은 객체 선택 리습입니다 .. 수정 부탁드립니다

작성자뽀가|작성시간10.04.04|조회수481 목록 댓글 6

 

성심 성의껏 질문을 작성하여 주세요, 대충하시면 답변도 대충작성합니다.^^

① CAD 종류   : auto cad

② VERSION   : 2008

③ 운영 체제    : xp pro

  

④ 질문내용 및 스크린샷(동영상)

 사용할때 마다 직교 모드가 풀리는거 같읍니다  오스냅은 그대로 인거 같은데 ,, 한번 봐주세요

 (defun c:3 ( / s:boundcenter on ob flst bp filter ss elst lst o p filter sss sp ep)
 (defun *error* (msg)
  (if (/= msg "function cancelled")
   (if (member msg '("quit / exit abort" "함수가 취소되었습니다."))
    (princ)
    (princ (strcat "\nerror: " msg))
   )
   (princ)
  )
  (setvar "nomutt" 0)
  (if ds
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ds)))
    (vla-highlight (vlax-ename->vla-object e) :vlax-false)
   )
  )
  (if os (setvar "osmode" os))
  (setq *error* nil ds nil os nil)
  (princ)
 )
 (defun s:boundcenter (ob / minpt maxpt)
  (vla-getboundingbox ob 'minpt 'maxpt)
  (setq minpt (vlax-safearray->list minpt))
  (setq maxpt (vlax-safearray->list maxpt))
  (mapcar '(lambda (a b) (* 0.5 (+ a b))) minpt maxpt)
 )
 (vl-load-com)
 (setvar "cmdecho" 0) 
 (sssetfirst nil nil)
 (setq os (getvar "osmode"))
 (princ "\n기준 객체들 선택:")
 (setvar "nomutt" 1)
 (if (not (setq ds (ssget))) (exit))
 (setvar "nomutt" 0)
 (princ "\n영역지정 또는 [도면 전체(엔터)]:")
 (if (setq sp (getpoint "\n첫 번째 구석점 지정:"))
  (setq ep (getcorner sp "\n다른 구석점 지정:"))
 )
 (foreach en (vl-remove-if 'listp (mapcar 'cadr (ssnamex ds))) 
  (vla-highlight (vlax-ename->vla-object en) :vlax-true)
  (setq on (cdr (assoc 0 (entget en))) lst (mapcar 'car (entget en)))
  (setq ob (vlax-ename->vla-object en) bp (s:boundcenter ob))
  (setq flst '(-1 1 5 10 11 13 14 43 44 330))
  (if (= on "DIMENSION") (setq flst (cons 2 flst)))
  (setq filter (vl-remove-if '(lambda (x) (member (car x) flst)) (entget en)))
  (setvar "osmode" 0)(setq ss (if ep (ssget "c" sp ep filter) (ssget "x" filter)))(setvar "osmode" os)
  (if ss
   (progn
    (vla-highlight (vlax-ename->vla-object en) :vlax-false)
    (setq elst (vl-remove en (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
    (setq elst (vl-remove-if '(lambda (x) (not (equal lst (mapcar 'car (entget x))))) elst))
    (vl-cmdf "undo" "be")
    (foreach x elst
     (setq o (vlax-ename->vla-object x) p (s:boundcenter o))
     (vla-move o (vlax-3d-Point p) (vlax-3d-Point bp))
    )
    (setq flst '(-1 5 13 14 330))
    (if (= on "DIMENSION") (setq flst (cons 2 flst)))
    (setq filter (vl-remove-if '(lambda (x) (member (car x) flst)) (entget en)))
    (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "P" filter))))
     (setq sss (if (not sss) (ssadd e) (ssadd e sss)))
    )
    (vl-cmdf "undo" "e" "undo" "")
   )
  )
 )
 (sssetfirst nil sss)
 (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ds)))
  (vla-highlight (vlax-ename->vla-object e) :vlax-false)
 )

 음 그리고 한가지 질문 더요.....

여러가지 올려주셧던 리습은 잘 쓰고 있읍니다 감사 드립니다 ,,,, 근데 lisp 사용 할때 마다 오스냅 설정이 

풀려 버리는 게 몇개 잇던데 .... 질문 검색해보니 

  

 이런 내용이 있더데 막상 수정하려 해보니 잘 이해가 안돼요 좀 풀어서 설명 해주시면 안될까요?

부탁드리는 것 보다 한번 직접 수정해보고 싶다는 욕심이 ^^:::

안되면 그때 부탁드릴게요 그냥 하는 방법을 좀 자세히 설명좀 해주세요 

대충 이해는 되는데 일단 현재 오스넵 저장하고 종료시 원래 오스냅 돌려주란 명령어 인거 같은데 

정확히 어디에 삽입 해야 되는지 ....

그럼 가슴 시원한 명쾌한 답변 기대 하겟읍니다...

감사합니다 .. 수고하세요  

 

 

 

⑤ 파일첨부 (LISP/DWG) - DWG 첨부시 보다 정확한 답변을 얻을수 있습니다.

 

첨부파일 같은거(3).lsp

 

 

 

 

※ 유의사항

 - ①말머리 : 말머리를 달아야 구분이 쉽겠죠^^

 - ②Screenshot : 이해를 돕기위해 삽입요망.

 - ③파일 첨부 : 상위버전에서 테스트할 파일이 아니면 가급적 하위버전으로 저장후 첨부.

                          해당리습/해당파일(DWG) 도 같이 첨부하여 주세요.

 - ④       목 : 질문 내용 반영(개략적인 내용),       예) 해치를 만들고 싶어요, pline을 연결할려면?

 - ⑤질문글 삭제금지 : 질문후 댓글이 달린글은 삭제금지.

    여러 리플러들이 소중한 시간을 내어서 고민한후 댓글을 작성한 이상 "강력조치" 토록 하겠음. 

 

※ 정답만이 댓글은 아닙니다. 그 답이 맞던 틀리던 그건 그 댓글로서 존중되어야 합니다.

    회원님들이 글을 읽었다는것과 댓글을 달았다는건 그만큼 관심을 가지고 있고 또 그 답을 해주기 위해

    검색도 해보고 도움말도 보고 고민도 하는 일련의 과정을 거치면서 나오기 때문이죠.

    이에 대한 고마움과 감사함을 모르는 테러행위(?)는 없었으면 합니다.

 

 

 

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자뽀가 작성자 본인 여부 작성자 | 작성시간 10.04.04 감사 합니다 한번 해볼게요 ^^;;;;
  • 작성자서페이스 | 작성시간 10.04.04 예를 들어 현재 실행프로그램 명령시 이전에 오스넵이 교차점만 켜져있다고 했을 때 명령어 종료후에 다시 이전에 있던
    오스넵 교차점을 돌려주는것은 됩니다...직교모드는 (setq ort(getvar "orthomode"));현재의 직교모드를 기억하라
    (if (= ort 1)(setvar "orthomode" 0)) ;만약 직각상태라면 해제하라 (setvar "orthomode" ort) ;직교모드를 원래대로 복귀하라
  • 작성자서페이스 | 작성시간 10.04.04 (setvar "orthomode" 0);0과1은 프로그램에 따라 다르게 변할 수있겠죠^^
  • 작성자Crony | 작성시간 10.04.05 추가로 에러구문에도 (setvar "osmode" os) 추가시켜주시면 좋아요^^
  • 작성자뽀가 작성자 본인 여부 작성자 | 작성시간 10.04.14 감사드려요 함번 해볼게요 ^^*
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼