Solved by godofcad. Go to Solution.
Solved by exceeds. Go to Solution.
Solved by godofcad. Go to Solution.
Solved by exceeds. Go to Solution.
간격이 일정하지 않게 떨어진 부분도 있고, 워낙 촘촘해서 그런지
pedit > j > fuzz 값 0.02 입력, overkill > tolerance 0.02입력 후 end to end,
스케일 늘려서 다시 실행하고 해도 완벽하게 안되고, 여러 부분으로 쪼개져서 합쳐지네요;
그렇다면..
퀵으로 만든 거라 절점 순서가 섞이는 문제가 있을 수 있긴한데
이렇게 시도해보시는 것도 좋을 것 같습니다.
좀 오래 걸려서 전체 돌리는건 gif에 안 넣었습니다.
explode해서 선 상태에서 실행하시면 됩니다.
아래쪽에 선이 하나만 긴 부분이 있는데, 거긴 빠질 수도 있으니 체크 필요합니다.
; PJEX - 2024.06.17
; Collects the start and end points of selected lines
; and draws those points as a continuous polyline in close order.
(defun c:PJEX ( / ss ssl i ptlist ent entlist sp ep 1pt ptstack diststack 2pt 12dist )
(vl-load-com)
(if (setq ss (ssget '((0 . "LINE"))))
(progn
(setq ssl (sslength ss))
(setq i 0)
(setq ptlist '())
(repeat ssl
(setq ent (ssname ss i))
(setq entlist (entget ent))
(setq sp (cdr (assoc 10 entlist)))
(setq ep (cdr (assoc 11 entlist)))
(setq ptlist (append ptlist (list (list 0 ep)) (list (list 0 sp))))
(setq i (+ i 1))
)
(setq ptstack '())
(while (> (length ptlist) 0)
(setq 1pt (cadr (car ptlist)))
(setq ptstack (cons 1pt ptstack))
(setq ptlist (cdr ptlist))
(setq diststack '())
(setq i 0)
(repeat (length ptlist)
(setq 2pt (cadr (nth i ptlist)))
(setq 12dist (distance 1pt 2pt))
(if (> 12dist 0)
(setq diststack (cons (list 12dist 2pt) diststack))
)
(setq i (+ i 1))
)
(setq diststack (vl-sort diststack (function (lambda (a b) (< (car a) (car b))))))
(setq ptlist diststack)
)
(entmakex (apply 'append
(list (list '(0 . "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length ptstack))
(cons 62 1)
(cons 43 0.01)
(cons 38 (caddr (trans '(0 0 0) 1 (trans '(0. 0. 1.) 1 0))))
(cons 70 0)
)
(mapcar '(lambda (x) (list 10 (car x) (cadr x))) ptstack)
(list (cons 210 (trans '(0. 0. 1.) 1 0)))
)
)
)
)
(progn
)
)
(princ)
)
간격이 일정하지 않게 떨어진 부분도 있고, 워낙 촘촘해서 그런지
pedit > j > fuzz 값 0.02 입력, overkill > tolerance 0.02입력 후 end to end,
스케일 늘려서 다시 실행하고 해도 완벽하게 안되고, 여러 부분으로 쪼개져서 합쳐지네요;
그렇다면..
퀵으로 만든 거라 절점 순서가 섞이는 문제가 있을 수 있긴한데
이렇게 시도해보시는 것도 좋을 것 같습니다.
좀 오래 걸려서 전체 돌리는건 gif에 안 넣었습니다.
explode해서 선 상태에서 실행하시면 됩니다.
아래쪽에 선이 하나만 긴 부분이 있는데, 거긴 빠질 수도 있으니 체크 필요합니다.
; PJEX - 2024.06.17
; Collects the start and end points of selected lines
; and draws those points as a continuous polyline in close order.
(defun c:PJEX ( / ss ssl i ptlist ent entlist sp ep 1pt ptstack diststack 2pt 12dist )
(vl-load-com)
(if (setq ss (ssget '((0 . "LINE"))))
(progn
(setq ssl (sslength ss))
(setq i 0)
(setq ptlist '())
(repeat ssl
(setq ent (ssname ss i))
(setq entlist (entget ent))
(setq sp (cdr (assoc 10 entlist)))
(setq ep (cdr (assoc 11 entlist)))
(setq ptlist (append ptlist (list (list 0 ep)) (list (list 0 sp))))
(setq i (+ i 1))
)
(setq ptstack '())
(while (> (length ptlist) 0)
(setq 1pt (cadr (car ptlist)))
(setq ptstack (cons 1pt ptstack))
(setq ptlist (cdr ptlist))
(setq diststack '())
(setq i 0)
(repeat (length ptlist)
(setq 2pt (cadr (nth i ptlist)))
(setq 12dist (distance 1pt 2pt))
(if (> 12dist 0)
(setq diststack (cons (list 12dist 2pt) diststack))
)
(setq i (+ i 1))
)
(setq diststack (vl-sort diststack (function (lambda (a b) (< (car a) (car b))))))
(setq ptlist diststack)
)
(entmakex (apply 'append
(list (list '(0 . "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length ptstack))
(cons 62 1)
(cons 43 0.01)
(cons 38 (caddr (trans '(0 0 0) 1 (trans '(0. 0. 1.) 1 0))))
(cons 70 0)
)
(mapcar '(lambda (x) (list 10 (car x) (cadr x))) ptstack)
(list (cons 210 (trans '(0. 0. 1.) 1 0)))
)
)
)
)
(progn
)
)
(princ)
)
선을 합치는 것이 어렵다면,
HATCH 기능으로 선 안에 새로운 SHAPE을 그려보세요~!
선을 합치는 것이 어렵다면,
HATCH 기능으로 선 안에 새로운 SHAPE을 그려보세요~!
1. 끝 점을 수동으로 입력해서, 닫힌 루프가 아닌 경우 순서가 꼬이는 것을 방지했습니다.
- 예시와 같이 원형인 경우는 아무 선의 끝 점을 지정하면 됩니다.
- 일직선이나 곡선인 경우 처음이나 마지막 점을 선택하면 됩니다.
2. 포인트 수집 후, 포인트 리스트를 순환하면서 3개씩 비교해서
1번 2번점 사이의 각도, 2번 3번점 사이의 각도가
기준 값 (Fuzz) 이하의 차이만 날 경우,
2번을 넘어서 3번 점을 수집하는 방식으로 최적화를 해봤습니다.
Fuzz값을 높은 값으로 지정할 수록, 위와 같이 폴리선의 정점의 수가 줄어듭니다.
(defun c:PJEX ( / ss ssl i ptlist ent entlist sp ep 1pt ptstack diststack 2pt 12dist )
(if (setq ss (ssget '((0 . "LINE"))))
(progn
(setq startpt (getpoint "\n Pick Start Point (Edge) : "))
(setq fuzz (getreal "\n input fuzz angle factor : "))
(princ "\n fuzz - ")
(princ fuzz)
(setq ssl (sslength ss))
(setq i 0)
(setq ptlist '())
(repeat ssl
(setq ent (ssname ss i))
(setq entlist (entget ent))
(setq sp (cdr (assoc 10 entlist)))
(setq ep (cdr (assoc 11 entlist)))
(setq ptlist (append ptlist (list (list (distance startpt ep) ep)) (list (list (distance startpt sp) sp))))
(setq i (+ i 1))
)
(setq ptlist (vl-sort ptlist (function (lambda (a b) (< (car a) (car b))))))
(setq ptstack '())
(while (> (length ptlist) 0)
(setq 1pt (cadr (car ptlist)))
(setq ptstack (cons 1pt ptstack))
(setq ptlist (cdr ptlist))
(setq diststack '())
(setq i 0)
(repeat (length ptlist)
(setq 2pt (cadr (nth i ptlist)))
(setq 12dist (distance 1pt 2pt))
(if (> 12dist 0)
(setq diststack (cons (list 12dist 2pt) diststack))
)
(setq i (+ i 1))
)
(setq diststack (vl-sort diststack (function (lambda (a b) (< (car a) (car b))))))
(setq ptlist diststack)
)
(setq ptdietstack '())
(setq pt1 (car ptstack))
(setq pt2 (cadr ptstack))
(setq ptdietstack (list pt2 pt1))
(setq ptstack (cddr ptstack))
(repeat (- (length ptstack) 1)
(setq pt1 (cadr ptdietstack))
(setq pt2 (car ptdietstack))
(setq pt3 (car ptstack))
(if (/= pt2 pt3)
(progn
(setq deg1 (/ (* 180 (angle pt1 pt2)) pi))
;(princ "\n deg1 - ") (princ deg1)
(setq deg2 (/ (* 180 (angle pt2 pt3)) pi))
;(princ "\n deg2 - ") (princ deg2)
(cond
((and (< (- deg1 fuzz) deg2) (< deg2 (+ deg1 fuzz)) )
;(princ "\n delete")
(setq ptdietstack (cdr ptdietstack))
(setq ptdietstack (cons pt3 ptdietstack))
)
(t
;(princ "\n stay")
(setq ptdietstack (cons pt3 ptdietstack))
)
)
)
)
(setq ptstack (cdr ptstack))
)
(setq ptstack (cons (car ptstack) ptdietstack))
(entmakex (apply 'append
(list (list '(0 . "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length ptstack))
(cons 62 1)
(cons 43 0.01)
(cons 38 (caddr (trans '(0 0 0) 1 (trans '(0. 0. 1.) 1 0))))
(cons 70 0)
)
(mapcar '(lambda (x) (list 10 (car x) (cadr x))) ptstack)
(list (cons 210 (trans '(0. 0. 1.) 1 0)))
)
)
)
)
(progn
)
)
(princ)
)
+
일단 폴리선까지만 생성하면, 최적화 하는 건 사실 제가 만든 것 보다 PLD(PLDiet)라는 리습을 찾아보시면 그게 더 잘될겁니다 ㅎㅎ;
++
영역이 닫혀있는 경우 + 영역을 구성하는 면의 갯수가 많지 않은 경우면
말씀하신 HATCH를 Pick Point로 생성한 뒤에,
HATCHGENERATEBOUNDARY로 HATCH의 외곽선을 쉽게 딸 수 있지만,
이 경우는 뚫려있는 곳도 많고, 자잘한 선이 4006개라..
영역이 닫혀있지 않아서 실패한다는 걸 판별하는 데만도 시간이 오래 걸릴듯합니다.
1. 끝 점을 수동으로 입력해서, 닫힌 루프가 아닌 경우 순서가 꼬이는 것을 방지했습니다.
- 예시와 같이 원형인 경우는 아무 선의 끝 점을 지정하면 됩니다.
- 일직선이나 곡선인 경우 처음이나 마지막 점을 선택하면 됩니다.
2. 포인트 수집 후, 포인트 리스트를 순환하면서 3개씩 비교해서
1번 2번점 사이의 각도, 2번 3번점 사이의 각도가
기준 값 (Fuzz) 이하의 차이만 날 경우,
2번을 넘어서 3번 점을 수집하는 방식으로 최적화를 해봤습니다.
Fuzz값을 높은 값으로 지정할 수록, 위와 같이 폴리선의 정점의 수가 줄어듭니다.
(defun c:PJEX ( / ss ssl i ptlist ent entlist sp ep 1pt ptstack diststack 2pt 12dist )
(if (setq ss (ssget '((0 . "LINE"))))
(progn
(setq startpt (getpoint "\n Pick Start Point (Edge) : "))
(setq fuzz (getreal "\n input fuzz angle factor : "))
(princ "\n fuzz - ")
(princ fuzz)
(setq ssl (sslength ss))
(setq i 0)
(setq ptlist '())
(repeat ssl
(setq ent (ssname ss i))
(setq entlist (entget ent))
(setq sp (cdr (assoc 10 entlist)))
(setq ep (cdr (assoc 11 entlist)))
(setq ptlist (append ptlist (list (list (distance startpt ep) ep)) (list (list (distance startpt sp) sp))))
(setq i (+ i 1))
)
(setq ptlist (vl-sort ptlist (function (lambda (a b) (< (car a) (car b))))))
(setq ptstack '())
(while (> (length ptlist) 0)
(setq 1pt (cadr (car ptlist)))
(setq ptstack (cons 1pt ptstack))
(setq ptlist (cdr ptlist))
(setq diststack '())
(setq i 0)
(repeat (length ptlist)
(setq 2pt (cadr (nth i ptlist)))
(setq 12dist (distance 1pt 2pt))
(if (> 12dist 0)
(setq diststack (cons (list 12dist 2pt) diststack))
)
(setq i (+ i 1))
)
(setq diststack (vl-sort diststack (function (lambda (a b) (< (car a) (car b))))))
(setq ptlist diststack)
)
(setq ptdietstack '())
(setq pt1 (car ptstack))
(setq pt2 (cadr ptstack))
(setq ptdietstack (list pt2 pt1))
(setq ptstack (cddr ptstack))
(repeat (- (length ptstack) 1)
(setq pt1 (cadr ptdietstack))
(setq pt2 (car ptdietstack))
(setq pt3 (car ptstack))
(if (/= pt2 pt3)
(progn
(setq deg1 (/ (* 180 (angle pt1 pt2)) pi))
;(princ "\n deg1 - ") (princ deg1)
(setq deg2 (/ (* 180 (angle pt2 pt3)) pi))
;(princ "\n deg2 - ") (princ deg2)
(cond
((and (< (- deg1 fuzz) deg2) (< deg2 (+ deg1 fuzz)) )
;(princ "\n delete")
(setq ptdietstack (cdr ptdietstack))
(setq ptdietstack (cons pt3 ptdietstack))
)
(t
;(princ "\n stay")
(setq ptdietstack (cons pt3 ptdietstack))
)
)
)
)
(setq ptstack (cdr ptstack))
)
(setq ptstack (cons (car ptstack) ptdietstack))
(entmakex (apply 'append
(list (list '(0 . "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length ptstack))
(cons 62 1)
(cons 43 0.01)
(cons 38 (caddr (trans '(0 0 0) 1 (trans '(0. 0. 1.) 1 0))))
(cons 70 0)
)
(mapcar '(lambda (x) (list 10 (car x) (cadr x))) ptstack)
(list (cons 210 (trans '(0. 0. 1.) 1 0)))
)
)
)
)
(progn
)
)
(princ)
)
+
일단 폴리선까지만 생성하면, 최적화 하는 건 사실 제가 만든 것 보다 PLD(PLDiet)라는 리습을 찾아보시면 그게 더 잘될겁니다 ㅎㅎ;
++
영역이 닫혀있는 경우 + 영역을 구성하는 면의 갯수가 많지 않은 경우면
말씀하신 HATCH를 Pick Point로 생성한 뒤에,
HATCHGENERATEBOUNDARY로 HATCH의 외곽선을 쉽게 딸 수 있지만,
이 경우는 뚫려있는 곳도 많고, 자잘한 선이 4006개라..
영역이 닫혀있지 않아서 실패한다는 걸 판별하는 데만도 시간이 오래 걸릴듯합니다.
와! 엄청난 솔루션이네요.
저는 닫혀있지 않은 선의 경우 끝점을 서로 연결하여 닫아준후 hatch로 따고 불필요한 부분을 삭제하는 방식을 사용했었습니다.
LISP이 있다니! 좋은 정보 감사합니다!!
와! 엄청난 솔루션이네요.
저는 닫혀있지 않은 선의 경우 끝점을 서로 연결하여 닫아준후 hatch로 따고 불필요한 부분을 삭제하는 방식을 사용했었습니다.
LISP이 있다니! 좋은 정보 감사합니다!!
Can't find what you're looking for? Ask the community or share your knowledge.