고객서비스

  • 프로그램다운로드
  • 팻치다운로드
  • 인증코드신청
  • 아키오피스자료실
  • 아키오피스강좌
  • 아키오피스동영상강좌
  • FAQ
  • FAQ

ArchiOffice강좌

질문과답변
제목 두 점과 그 사이의 객체들과의 교점 찾기.
등록일 2002-05-29 조회 630
아래 코드는 두점을 지나는 선과
그 선에 접하는 객체들의 교차점을 찾아서
X 좌표값을 기준으로 정렬하는 코드입니다.
All_Intersection_Point_List 변수에 교차점 좌표값이 저장됩니다.
그리고 선과 객체들이 교차하는 부분은 포인트(pdmode 35)로 표시했습니다.
대부분의 코드가 activeX코드를 사용했기 때문에
이해를 요하는 부분은 따로 게시판을 통해서 질문하시기 바랍니다.


;;->두점사이의 객체들과 그 두 점을 지나는 선과의 교점을 찾는 리습코
드.

(defun GetIntersectionPoint (/ IntersectionList PointList)
(vl-load-com)
(setq acadObject (vlax-get-acad-object))
(setq acadDocument (vla-get-ActiveDocument acadObject))
(setq mSpace (vla-get-ModelSpace acadDocument))
;;--객체 선언부...

(setvar "pdmode" 35)
(setq SSetName "MySSet")
(setq SSets (vla-get-SelectionSets acadDocument))

(if (vl-catch-all-error-p
(vl-catch-all-apply 'vla-add (list SSets SSetName))
) ;_ End of vl-catch-all-error-p
(vla-clear (vla-Item SSets SSetName))
) ;_ End of if.
;;-->SelectionSet을 생성하고 기존에 있는 Set이면 내용을 비우고, 없으면 새로 생성한다.
(setq SSet (vla-Item SSets SSetName))
;;->새로 만든 SelectionSet을 변수로 지정해둔다.

(setq FirstPoint (getpoint "\n첫번째 점을 선택하세요_ :"))
(setq SecondPoint (getpoint FirstPoint "\n두번째 점을 선택하세요_:"))
(setq fp (vlax-3d-point FirstPoint))
(setq sp (vlax-3d-point SecondPoint))
(vlax-invoke mspace 'Addpoint FirstPoint)
(vlax-invoke mspace 'Addpoint SecondPoint)
;;->두점을 포인트로 마크해둔다.

(setq Baseline (vlax-invoke-method mspace 'Addline fp sp))
;;->포인트로 받은 두점을 라인으로 만들어서 다른 객체들과 교차하는지 비교한다.
(vla-select SSet acSelectionSetCrossing sP fP)
;;->만들어둔 SelectionSet에 포인트로 만든 라인과,
;;->교차하는 모든 객체를 선택해서 모아서 비교하는데 사용한다.

(setq Count (vla-get-count SSet))
(setq CountNumber 0)

(repeat Count
(setq CheckObject (vla-item SSet CountNumber))
(setq IntersectionList (vlax-invoke BaseLine "IntersectWith" CheckObject acExtendNone ))

;;**********************************************
(cond
(IntersectionList
(repeat (/ (length IntersectionList) 3)
(setq PointList (cons
(list
(car IntersectionList)
(cadr IntersectionList)
(caddr IntersectionList)
) ;_ End of list
PointList
) ;_ End of cons
IntersectionList (cdddr IntersectionList)
) ;_ End of setq
) ;_ End of repeat
(reverse PointList)
)
(T nil)
) ;_ End of cond
;;**********************************************

;;-> 위의 cond코드 부분은 .
;; Copyright ⓒ2000 MENZI ENGINEERING GmbH, ; Switzerland.
;;http://www.menziengineering.ch - 의 Free Stuff에서 인용한것이다.

(setq CountNumber (1+ CountNumber))

) ;_ End of repeat.

(vla-delete BaseLine)
;;->라인과 교차하는 객체들과의 교차점 비교가 끝나면 라인은 지운다.

(setq Layers (vla-get-Layers acadDocument))
(setq NewLayer (vla-add Layers "CheckPoint"));;->CheckPoint레이어 새로 추가.
(vla-put-ActiveLayer acadDocument NewLayer);;->CheckPoint레이어를 현재상태로 만듬.

(foreach n PointList (vlax-invoke mspace 'Addpoint n ))
;;-->모든 교차점에 포인트로 표시해준다.
(setq All_Intersection_Point_List (vl-sort PointList '(lambda (e1 e2) (< (car e1) (car e2)))))
;;->x좌표값을 기준으로 좌표값을 정렬한다.

(setq 0-Layer (vla-item Layers "0"))
(vla-put-ActiveLayer acadDocument 0-Layer)
;;->모든 작업이 끝나면 레이어를 다시 "0"으로 되될린다.
(princ)

);_ End of defun.