Chuyển đến nội dung
Diễn đàn CADViet
doanduyhung

Hỏi cách chuyển đổi vị trí tọa độ đầu cuối của 1 polyline

Các bài được khuyến nghị

Ban đầu

1_79.jpg

Chuyền đổi

2_46.jpg

Mục đích hoán đổi vị trí tọa độ của polyline theo chiều ngược lại nhưng vẩn giữ nguyên polyline ban đầu.

Bạn nào có list chuyển đổi thì giúp mình với nhé.

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Ban đầu

1_79.jpg

Chuyền đổi

2_46.jpg

Mục đích hoán đổi vị trí tọa độ của polyline theo chiều ngược lại nhưng vẩn giữ nguyên polyline ban đầu.

Bạn nào có list chuyển đổi thì giúp mình với nhé.

bạn dùng lệnh align cũng được mà :cheers:

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
bạn dùng lệnh align cũng được mà :cheers:

Dùng Align thi polyline bị xoay mất rồi, ở đây mình chỉ muốn đảo chiều verter của polyline đó thôi

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Dùng Align thi polyline bị xoay mất rồi, ở đây mình chỉ muốn đảo chiều verter của polyline đó thôi

Bạn hãy sử dụng lại lệnh Align xem sao. Bạn binharch77 nói đúng đó.

Nếu sử dụng Lisp thì Code đây :

(defun c:Cdc()
(vl-load-com)
(prompt "\n Chon polyline :")
(setq curve (car(entsel "\n Chon Polyline :")))
(setq dau (vlax-curve-getStartPoint curve))
(setq cuoi (vlax-curve-getEndPoint curve))
(Command "Align" curve "" dau cuoi cuoi dau "" "")
(princ)
)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em thấy cái lips của bác Tue có vấn đề !

nếu pline chỉ có 2 điểm thì ko vấn đề ! Nhưng nếu pline có nhiều hơn 3 điểm thì nó chỉ giữ được điểm đầu và cuối còn các điểm trung gian thì bị thay đổi hết ( hình như bạn ấy yêu cầu các điểm trung gian cũng ko thay đổi ). Bác xem lại dùm em nhé !!!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn hãy sử dụng lại lệnh Align xem sao. Bạn binharch77 nói đúng đó.

Nếu sử dụng Lisp thì Code đây :

(defun c:Cdc()
(vl-load-com)
(prompt "\n Chon polyline :")
(setq curve (car(entsel "\n Chon Polyline :")))
(setq dau (vlax-curve-getStartPoint curve))
(setq cuoi (vlax-curve-getEndPoint curve))
(Command "Align" curve "" dau cuoi cuoi dau "" "")
(princ)
)

Bác xem lại dùm nhé, làm cách này nếu polyline có nhiều đoạn thì nó bị thay đổi rồi

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Ban đầu

1_79.jpg

Chuyền đổi

2_46.jpg

Mục đích hoán đổi vị trí tọa độ của polyline theo chiều ngược lại nhưng vẩn giữ nguyên polyline ban đầu.

Bạn nào có list chuyển đổi thì giúp mình với nhé.

 

khổ quá em xin van nạy các bác ngả nón!!!!!!!????? các bác cứ quan trọng hóa vấn đề như nhà bác học!!!! ko biết nhà bác học nào ứ nhể! cái nhà bác học đã đục 2 lỗ :

1 lỗ cho con bò đi qua

1 lỗ cho con lợn đi qua

trong khi chỉ cần đục một lỗ cho con bò chui lọt tất dĩ nhiên con lợn cũng chui lọt ! và rằng thì mà là con chuột nhắt cũng chui lọt....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
khổ quá em xin van nạy các bác ngả nón!!!!!!!????? các bác cứ quan trọng hóa vấn đề như nhà bác học!!!! ko biết nhà bác học nào ứ nhể! cái nhà bác học đã đục 2 lỗ :

1 lỗ cho con bò đi qua

1 lỗ cho con lợn đi qua

trong khi chỉ cần đục một lỗ cho con bò chui lọt tất dĩ nhiên con lợn cũng chui lọt ! và rằng thì mà là con chuột nhắt cũng chui lọt....

hề hề ... cao thủ cao thủ :cheers: :)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có thể Doanduyhung lấy ví dụ không điển hình nên mọi người đã hiểu nhầm. Trong một số trường hợp, chiều của polyline (liên quan đến điểm xuất phát của polyline) là quan trọng. Với polyline chỉ gồm 2 điểm thì đơn giản là rotate 180 độ tại trung điểm là coi như xong. Nhưng với polyline có nhiều điểm hơn thì không làm được như vậy, nếu rotate (hay align) thì chiều polyline thay đổi nhưng kéo theo các đỉnh cũng bị dịch chuyển so với hình gốc.

 

Các bạn thử dùng lisp này xem sao. Lệnh là REP (REverse Polyline)

(defun c:rep( / c10 tt)
 (setq 
tt (entget (car (entsel "\nHay pick vao mot Polyline: ")))
c10 (reverse (vl-remove-if '(lambda (x) (/= (car x) 10)) tt))
tt (mapcar '(lambda (x) (if (= 10 (car x)) (setq e (car c10) c10 (cdr c10) e e) x)) tt)
 )
 (entmod tt)
 (princ)
)
(vl-load-com)

Lisp này chỉ áp dụng cho các polyline không chứa arc.

  • Vote tăng 4

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Có thể Doanduyhung lấy ví dụ không điển hình nên mọi người đã hiểu nhầm. Trong một số trường hợp, chiều của polyline (liên quan đến điểm xuất phát của polyline) là quan trọng. Với polyline chỉ gồm 2 điểm thì đơn giản là rotate 180 độ tại trung điểm là coi như xong. Nhưng với polyline có nhiều điểm hơn thì không làm được như vậy, nếu rotate (hay align) thì chiều polyline thay đổi nhưng kéo theo các đỉnh cũng bị dịch chuyển so với hình gốc.

 

Các bạn thử dùng lisp này xem sao. Lệnh là REP (REverse Polyline)

(defun c:rep( / c10 tt)
 (setq 
tt (entget (car (entsel "\nHay pick vao mot Polyline: ")))
c10 (reverse (vl-remove-if '(lambda (x) (/= (car x) 10)) tt))
tt (mapcar '(lambda (x) (if (= 10 (car x)) (setq e (car c10) c10 (cdr c10) e e) x)) tt)
 )
 (entmod tt)
 (princ)
)
(vl-load-com)

Lisp này chỉ áp dụng cho các polyline không chứa arc.

Em thấy ý kiến của bác Hoành hoàn toàn hợp lý vì bác đưa ra trường hợp tổng quát chung cho mọi trường hợp. Vì bác doanduyhung chỉ đưa ra 1 trường hợp cụ thể nên em cũng ... thú thực với bác là ăn nói chưa được tổng hợp ...có gì ko phải bác bỏ qua cho em nhá! Em xin cảm ơn bác và sẽ rút kinh nghiệm trước khi nhận xét đáng giá một việc gì đó!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Em mới học vẽ ko chưa biết sử dụng lisp . E ko biết chuyển đổi vị trí toạ độ điểm đầu và cuối của Polyline để làm gì , dung nó khi nào. Các anh vẽ hình minh hoạ về chuyển đổi bằng sử dụng lisp để chuyển đổi nhé em cám ơn trước.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mục đích hoán đổi vị trí tọa độ của polyline theo chiều ngược lại nhưng vẩn giữ nguyên polyline ban đầu.

Bạn nào có list chuyển đổi thì giúp mình với nhé.

Mục đích để làm gì vậy nhỉ. Bạn nên nghĩ cách xử lý bài toán của mình theo một polyline có chiều bất kỳ thì hơn. Nếu thuận thì xử lý thế này, nếu ngược thì thế này..., Còn nếu đổi chiều mà không kiểm tra có khi lại làm thuận thành nghịch.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mục đích để làm gì vậy nhỉ. Bạn nên nghĩ cách xử lý bài toán của mình theo một polyline có chiều bất kỳ thì hơn. Nếu thuận thì xử lý thế này, nếu ngược thì thế này..., Còn nếu đổi chiều mà không kiểm tra có khi lại làm thuận thành nghịch.

cái này ở chỗ em dùng để đổi chiều khi vẽ đường viền đá !

Thx bác Hoành nhiều nhiều !!!!!!!!!!!!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Có thể Doanduyhung lấy ví dụ không điển hình nên mọi người đã hiểu nhầm. Trong một số trường hợp, chiều của polyline (liên quan đến điểm xuất phát của polyline) là quan trọng. Với polyline chỉ gồm 2 điểm thì đơn giản là rotate 180 độ tại trung điểm là coi như xong. Nhưng với polyline có nhiều điểm hơn thì không làm được như vậy, nếu rotate (hay align) thì chiều polyline thay đổi nhưng kéo theo các đỉnh cũng bị dịch chuyển so với hình gốc.

 

Các bạn thử dùng lisp này xem sao. Lệnh là REP (REverse Polyline)

(defun c:rep( / c10 tt)
 (setq 
tt (entget (car (entsel "\nHay pick vao mot Polyline: ")))
c10 (reverse (vl-remove-if '(lambda (x) (/= (car x) 10)) tt))
tt (mapcar '(lambda (x) (if (= 10 (car x)) (setq e (car c10) c10 (cdr c10) e e) x)) tt)
 )
 (entmod tt)
 (princ)
)
(vl-load-com)

Lisp này chỉ áp dụng cho các polyline không chứa arc.

Thank bác nhé để mình mò thêm code cho polyline co chứa arc xem sao.

Mục đích cái này để mình phát triển thiết kế tuyến đường trên bình đồ thôi.

Thank bác nhiều

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mới sưu tầm trên mạng; cái này dùng cho cả polyline chứa arc gửi lại cho anh em nào quan tâm nhé

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:rpl ()

(setq again nil)

(setq p-ent nil)

(prompt "\nSelect a polyline: ")

(while (not p-ent)

(setq p-ent (car (entsel)))

(if (not p-ent)

(prompt

"\nNo object selected; select again: "

) ;_ end of prompt

(progn

(if (and (/= (dxf 0 p-ent) "POLYLINE")

(/= (dxf 0 p-ent) "LWPOLYLINE")

) ;_ end of and

(progn

(prompt "\nNot a polyline, select again:"

) ;_ end of prompt

(setq p-ent nil)

) ; progn

) ;_ end of if

) ;_ end of progn

) ;_ end of if

) ;_ end of while

(setq etype (dxf 0 p-ent)

x-ent p-ent

is-closed (dxf 70 p-ent)

) ; setq

(if (= etype "LWPOLYLINE")

(progn

(setq num-vert (dxf 90 p-ent)

elist (entget p-ent)

elist (member (assoc 10 elist) elist)

vvlist nil

) ; setq

(repeat num-vert

(setq vlist (list (cdr (assoc 10 elist))))

(setq vlist

(append vlist

(list (cdr (assoc 42 elist)))

) ;_ end of append

) ;_ end of setq

(setq vvlist (append vvlist

(list vlist)

) ;_ end of append

) ;_ end of setq

(setq elist (cdr elist)

elist (member (assoc 10 elist) elist)

) ; setq

) ; repeat

) ; progn lwpolyline

(progn

(setq vvlist nil

p-ent (entnext p-ent)

) ; setq

(while (/= "SEQEND"

(cdr

(assoc 0 (entget p-ent))

) ;_ end of cdr

) ;_ end of /=

(setq vlist (list (dxf 10 p-ent)))

(setq vlist (append vlist

(list (dxf 42 p-ent))

) ;_ end of append

) ;_ end of setq

(setq vvlist (append vvlist

(list vlist)

) ;_ end of append

) ;_ end of setq

(setq p-ent (entnext p-ent))

) ; while

) ; progn polyline

) ; if

(setq p-list (mapcar 'car vvlist)

p-list (reverse p-list)

b-list (mapcar 'cadr vvlist)

b-list (reverse b-list)

b-first (car b-list)

b-list (cdr b-list)

b-list (append b-list (list b-first))

b-list (mapcar '- b-list)

) ; setq

(setq enlist (list '(0 . "LWPOLYLINE")

'(100 . "AcDbEntity")

'(100 . "AcDbPolyline")

(cons 90 (length p-list))

(cons 70 (dxf 70 x-ent))

(cons 8 (dxf 8 x-ent))

) ; list

) ; setq

(setq elst nil)

(repeat (length p-list)

(setq

elst (append elst

(list (cons 10 (car p-list)))

) ;_ end of append

) ; setq

(setq

elst (append elst

(list (cons 42 (car b-list)))

) ;_ end of append

) ; setq

(setq p-list (cdr p-list))

(setq b-list (cdr b-list))

) ; repeat

(setq enlist (append enlist elst))

(entdel x-ent)

(entmake enlist)

(prompt "\nPolyline direction is reversed.\n ")

(princ)

) ; rpl

 

(defun dxf (code ename)

(cdr (assoc code (entget ename)))

) ;_ end of dxf

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mục đích để làm gì vậy nhỉ. Bạn nên nghĩ cách xử lý bài toán của mình theo một polyline có chiều bất kỳ thì hơn. Nếu thuận thì xử lý thế này, nếu ngược thì thế này..., Còn nếu đổi chiều mà không kiểm tra có khi lại làm thuận thành nghịch.

Trường hợp này thường là do bạn ấy dùng linetype không có tính chất đối xứng. Thường thi lạo ra linetype không đối xứng người tạo cẩn thận sẽ tạo ra 1 linetype thuận và 1 linetype nghịch. Ví dụ đường taluy có khi mình muốn taluy phía này có khi muốn phía kia. Bạn này theo mình nghỉ trong tay lại có 1 đường thuận mà không có đường nghịch nên mới có yêu cầu như trên.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn hãy sử dụng lại lệnh Align xem sao. Bạn binharch77 nói đúng đó.

Nếu sử dụng Lisp thì Code đây :

(defun c:Cdc()
(vl-load-com)
(prompt "\n Chon polyline :")
(setq curve (car(entsel "\n Chon Polyline :")))
(setq dau (vlax-curve-getStartPoint curve))
(setq cuoi (vlax-curve-getEndPoint curve))
(Command "Align" curve "" dau cuoi cuoi dau "" "")
(princ)
)

  • Vote giảm 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mọi nguời trong diễn đàn sao vậy nhỉ? cứ phức tạp hoá vấn đề... Mình tham gia muộn quá, chứ cái này chỉ cần vẽ 1 polyline ngược lại rồi joint vào. Thế là đảo chiều được rồi

  • Vote giảm 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mọi nguời trong diễn đàn sao vậy nhỉ? cứ phức tạp hoá vấn đề... Mình tham gia muộn quá, chứ cái này chỉ cần vẽ 1 polyline ngược lại rồi joint vào. Thế là đảo chiều được rồi

Không phải Mọi nguời cứ phức tạp hoá vấn đề. mà là do bạn "đơn giản hóa vấn đề đó thôi ?!"

Giả sử polyline có 50 hay 100 segment thì bạn vẽ bao giờ mới xong ?

Chưa kể t/hợp polyline có segment là cung tròn ?

 

Biết 1,2 mà chưa biết 50 (hay 100) là vậy đó! :rolleyes:

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không phải Mọi nguời cứ phức tạp hoá vấn đề. mà là do bạn "đơn giản hóa vấn đề đó thôi ?!"

Giả sử polyline có 50 hay 100 segment thì bạn vẽ bao giờ mới xong ?

Chưa kể t/hợp polyline có segment là cung tròn ?

 

Biết 1,2 mà chưa biết 50 (hay 100) là vậy đó! :rolleyes:

Bác giabach hiểu sai ý của only rồi. Lám như của only là cách mình hay dùng:

-Vẽ 1 pline theo chiều mong muốn.

-Joint cái pline mới vào lipne cũ (chọn cái mới trước)thiì nó đảo chiều pline gốc của mình lại đương nhiên bị dính thèn mới vào.

-Bứt cái mới dính bỏ đi thì xong thủ tục.

Nói vậy không phải mình đồng ý với bạn only Có lisp giải quyết thì ngon hơn nhiều chứ.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bác giabach hiểu sai ý của only rồi. Lám như của only là cách mình hay dùng:

-Vẽ 1 pline theo chiều mong muốn.

-Joint cái pline mới vào lipne cũ (chọn cái mới trước)thiì nó đảo chiều pline gốc của mình lại đương nhiên bị dính thèn mới vào.

-Bứt cái mới dính bỏ đi thì xong thủ tục.

Nói vậy không phải mình đồng ý với bạn only Có lisp giải quyết thì ngon hơn nhiều chứ.

Em nghĩ việc xoá 1 đối tuợng rồi thay thế nó bằng 1 đối tuợng mới là điều bất quá mới phải làm. truớc đây khi mới tập viết lisp em cũng hay tư duy theo cách này. Đặc biệt là đối với các đối tuợng do 1 số phần mềm tạo ra có chứa dữ liệu mở rộng trong cơ sở dữ liệu đối tuợng thì điều này là tuyệt đối cấm kỵ. thêm nữa cách làm như vậy cũng sẽ ảnh huởng rất lớn đến tốc độ của chuơng trình.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ban đầu

1_79.jpg

Chuyền đổi

2_46.jpg

Mục đích hoán đổi vị trí tọa độ của polyline theo chiều ngược lại nhưng vẩn giữ nguyên polyline ban đầu.

Bạn nào có list chuyển đổi thì giúp mình với nhé.

Èo không biết các bác biến đổi thế nào, nhưng 1 phần của 1 lsp của em đang viết có việc chuyển toạ độ đỉnh polyline không biết thế nào post lên các bác tham khảo và góp ý

(defun c:thu (/ C10 C40 C41 C42 C50 C70 CC40 CC41 CC42 DINH ENT ENT2 I N N10 N40 N41 N42 N50 N70 NC40 NC41 NC42 OSMODEC SS SSN SSN2 TEST0 TEST1 C11 N11)
 (while (null(setq ss (entsel "\n Chon polyline: "))))
 (setq osmodec (getvar "osmode"))
 (setvar "osmode" 1)
 (setq dinh (getpoint "\n Chon diem dau: "))
 (setq ssn (car ss))
 (setq ent (entget ssn))  
 (if (= (cdr(assoc 0 ent)) "POLYLINE")
   (progn
     (setq test1 (vlax-curve-getEndPoint ssn))
     (if (=(cdr(assoc 66 ent)) 1)
(progn
  (setq ssn2 (entnext ssn))
  (setq ent2 (entget ssn2))
  (setq test0 (cdr(assoc 10 ent2)))
  (if (equal dinh test1 0.00001)
    (progn
      (setq c42 (append c42 (list(cons 42 0))))
      (setq c40 (append c40 (list(cons 40 0))))
      (setq c41 (append c41 (list(cons 41 0))))
      (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	(setq c10 (append c10 (list(assoc 10 ent2))))
	(setq c40 (append c40 (list(assoc 40 ent2))))
	(setq c41 (append c41 (list(assoc 41 ent2))))
	(setq c42 (append c42 (list(assoc 42 ent2))))
	(setq c70 (append c70 (list(assoc 70 ent2))))
	(setq c50 (append c50 (list(assoc 50 ent2))))
	(setq ssn2 (entnext ssn2))
	(setq ent2 (entget ssn2))
	);end while
      (setq n (- (length c42) 2))
      (setq i 0)
      (while (<= i n)
	(setq nc42 (append nc42 (list(nth i c42))))
	(setq nc40 (append nc40 (list(nth i c40))))
	(setq nc41 (append nc41 (list(nth i c41))))
	(setq i (1+ i))
	);end while
      (setq i 1)
      (while (<= i n)
	(setq cc42 (append cc42 (list(nth i c42))))
	(setq cc41 (append cc41 (list(nth i c41))))
	(setq cc40 (append cc40 (list(nth i c40))))
	(setq i (1+ i))
	);end while
      (setq c42 nil c42 cc42 c41 nil c41 cc41 c40 nil c40 cc40)
      (setq ss (ssget "_P"))
      (setq ent (entget ssn))
      (if (=(cdr(assoc 66 ent)) 1)
	(progn
	  (setq i 0)
	  (setq ssn2 (entnext ssn))
	  (setq ent2 (entget ssn2))
	  (setq n10 (reverse c10))
	  (setq n40 (reverse nc40))
	  (setq n41 (reverse nc41))
	  (setq n42 (reverse nc42))
	  (setq n70 (reverse c70))
	  (setq n50 (reverse c50))
	  (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	    (setq ent2 (subst (nth i n10) (nth i c10) ent2))
	    (setq ent2 (subst (cons 40 (cdr(nth i n41))) (nth i c40) ent2))
	    (setq ent2 (subst (cons 41 (cdr(nth i n40))) (nth i c41) ent2))
	    (setq ent2 (subst (cons 42 (- 0 (cdr(nth i n42)))) (nth i c42) ent2))
	    (setq ent2 (subst (nth i n70) (nth i c70) ent2))
	    (setq ent2 (subst (nth i n50) (nth i c50) ent2))
	    (entmod ent2)
	    (setq i (1+ i))
	    (setq ssn2 (entnext ssn2))
	    (setq ent2 (entget ssn2))
	    );end while
	  (entupd ssn)
	  );end progn
	);end if
      );end progn
    );end if
  );end progn
);end if
     );end progn
   );end if
 (if (= (cdr(assoc 0 ent)) "LINE")
   (progn      
     (setq test0 (cdr(assoc 10 ent)))
     (if (equal dinh test0 0.00001)
(progn
  (setq c10 (assoc 10 ent))  
  (setq c11 (assoc 11 ent))
  (setq n10 (assoc 11 ent))
  (setq n11 (assoc 10 ent))
  (setq ent (subst (cons 10 (cdr n10)) c10 ent))
  (setq ent (subst (cons 11 (cdr n11)) c11 ent))
  (entmod ent)
  (entupd ssn)
  );end progn	
);end if
     );end progn
   );end if
 (if (= (cdr(assoc 0 ent)) "ARC")
   (progn
     (vl-cmdf "pedit" ss "y" "")
     (if (= (cdr(assoc 0 ent)) "POLYLINE")
   (progn
     (setq test1 (vlax-curve-getEndPoint ssn))
     (if (=(cdr(assoc 66 ent)) 1)
(progn
  (setq ssn2 (entnext ssn))
  (setq ent2 (entget ssn2))
  (setq test0 (cdr(assoc 10 ent2)))
  (if (equal dinh test1 0.00001)
    (progn
      (setq c42 (append c42 (list(cons 42 0))))
      (setq c40 (append c40 (list(cons 40 0))))
      (setq c41 (append c41 (list(cons 41 0))))
      (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	(setq c10 (append c10 (list(assoc 10 ent2))))
	(setq c40 (append c40 (list(assoc 40 ent2))))
	(setq c41 (append c41 (list(assoc 41 ent2))))
	(setq c42 (append c42 (list(assoc 42 ent2))))
	(setq c70 (append c70 (list(assoc 70 ent2))))
	(setq c50 (append c50 (list(assoc 50 ent2))))
	(setq ssn2 (entnext ssn2))
	(setq ent2 (entget ssn2))
	);end while
      (setq n (- (length c42) 2))
      (setq i 0)
      (while (<= i n)
	(setq nc42 (append nc42 (list(nth i c42))))
	(setq nc40 (append nc40 (list(nth i c40))))
	(setq nc41 (append nc41 (list(nth i c41))))
	(setq i (1+ i))
	);end while
      (setq i 1)
      (while (<= i n)
	(setq cc42 (append cc42 (list(nth i c42))))
	(setq cc41 (append cc41 (list(nth i c41))))
	(setq cc40 (append cc40 (list(nth i c40))))
	(setq i (1+ i))
	);end while
      (setq c42 nil c42 cc42 c41 nil c41 cc41 c40 nil c40 cc40)
      (setq ss (ssget "_P"))
      (setq ent (entget ssn))
      (if (=(cdr(assoc 66 ent)) 1)
	(progn
	  (setq i 0)
	  (setq ssn2 (entnext ssn))
	  (setq ent2 (entget ssn2))
	  (setq n10 (reverse c10))
	  (setq n40 (reverse nc40))
	  (setq n41 (reverse nc41))
	  (setq n42 (reverse nc42))
	  (setq n70 (reverse c70))
	  (setq n50 (reverse c50))
	  (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	    (setq ent2 (subst (nth i n10) (nth i c10) ent2))
	    (setq ent2 (subst (cons 40 (cdr(nth i n41))) (nth i c40) ent2))
	    (setq ent2 (subst (cons 41 (cdr(nth i n40))) (nth i c41) ent2))
	    (setq ent2 (subst (cons 42 (- 0 (cdr(nth i n42)))) (nth i c42) ent2))
	    (setq ent2 (subst (nth i n70) (nth i c70) ent2))
	    (setq ent2 (subst (nth i n50) (nth i c50) ent2))
	    (entmod ent2)
	    (setq i (1+ i))
	    (setq ssn2 (entnext ssn2))
	    (setq ent2 (entget ssn2))
	    );end while
	  (entupd ssn)
	  );end progn
	);end if
      );end progn
    );end if
  );end progn
);end if
     );end progn
   );end if
     );end progn
   );end if
 (setvar "osmode" osmodec)
 (princ)
 )

Các bác chạy thủ rồi cho em ý kiến nhé.

PS: Lsp của em đổi được LINE, ARC, POLYLINE giữ nguyên đặc tính ví dụ như polyline chia 2 đoạn 1 đoạn có width 1 đoạn không thì không xi nhê vẫn đẹp đẽ. ^_^ chúc các bác mần tốt.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Èo không biết các bác biến đổi thế nào, nhưng 1 phần của 1 lsp của em đang viết có việc chuyển toạ độ đỉnh polyline không biết thế nào post lên các bác tham khảo và góp ý Các bác chạy thủ rồi cho em ý kiến nhé.

PS: Lsp của em đổi được LINE, ARC, POLYLINE giữ nguyên đặc tính ví dụ như polyline chia 2 đoạn 1 đoạn có width 1 đoạn không thì không xi nhê vẫn đẹp đẽ. ^_^ chúc các bác mần tốt.

Lisp của bạn chưa đổi được LWPOLYLINE

(if (= (cdr(assoc 0 ent)) "POLYLINE")

(progn

.......

Với PLINE kín thì có biết đâu được đâu là điểm đầu bạn?

Sử dụng Properties mới biết được thôi

Với PLINE kín, Lisp đổi được 1 lần duy nhất rồi trơ trơ,

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lisp của bạn chưa đổi được LWPOLYLINE

(if (= (cdr(assoc 0 ent)) "POLYLINE")

(progn

.......

Với PLINE kín thì có biết đâu được đâu là điểm đầu bạn?

Sử dụng Properties mới biết được thôi

Với PLINE kín, Lisp đổi được 1 lần duy nhất rồi trơ trơ,

Gửi bác TUE_NV, em đã chỉnh lại để PLINE khép kín chạy ầm ầm còn về phần LWPOLYLINE thì em không hay dùng và nói cách khác em chưa biết cách lấy dữ liệu của LWpolyline bác ví dụ cho em 1 đoạn lsp lấy giá trị của lwpolyline (VD lấy toạ độ điểm các đỉnh LWPOLYLINE) mong bác chỉ dùm

(defun c:thu (/ C10 C40 C41 C42 C50 C70 CC40 CC41 CC42 DINH ENT ENT2 I N N10 N40 N41 N42 N50 N70 NC40 NC41 NC42 OSMODEC SS SSN SSN2 TEST0 TEST1 C11 N11)
 (while (null(setq ss (entsel "\n Chon polyline: "))))
 (setq osmodec (getvar "osmode"))
 (setvar "osmode" 1)
 (setq dinh (getpoint "\n Chon diem dau: "))
 (setq ssn (car ss))
 (setq ent (entget ssn))  
 (if (= (cdr(assoc 0 ent)) "POLYLINE")
   (progn
     (setq test1 (vlax-curve-getEndPoint ssn))
     (setq test2 (vlax-curve-getStartPoint ssn))
     (if (=(cdr(assoc 66 ent)) 1)
(progn
  (setq ssn2 (entnext ssn))
  (setq ent2 (entget ssn2))
  (setq test0 (cdr(assoc 10 ent2)))
  (if (or(equal dinh test1 0.00001)(equal test1 test2))
    (progn
      (setq c42 (append c42 (list(cons 42 0))))
      (setq c40 (append c40 (list(cons 40 0))))
      (setq c41 (append c41 (list(cons 41 0))))
      (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	(setq c10 (append c10 (list(assoc 10 ent2))))
	(setq c40 (append c40 (list(assoc 40 ent2))))
	(setq c41 (append c41 (list(assoc 41 ent2))))
	(setq c42 (append c42 (list(assoc 42 ent2))))
	(setq c70 (append c70 (list(assoc 70 ent2))))
	(setq c50 (append c50 (list(assoc 50 ent2))))
	(setq ssn2 (entnext ssn2))
	(setq ent2 (entget ssn2))
	);end while
      (setq n (- (length c42) 2))
      (setq i 0)
      (while (<= i n)
	(setq nc42 (append nc42 (list(nth i c42))))
	(setq nc40 (append nc40 (list(nth i c40))))
	(setq nc41 (append nc41 (list(nth i c41))))
	(setq i (1+ i))
	);end while
      (setq i 1)
      (while (<= i n)
	(setq cc42 (append cc42 (list(nth i c42))))
	(setq cc41 (append cc41 (list(nth i c41))))
	(setq cc40 (append cc40 (list(nth i c40))))
	(setq i (1+ i))
	);end while
      (setq c42 nil c42 cc42 c41 nil c41 cc41 c40 nil c40 cc40)
      (setq ss (ssget "_P"))
      (setq ent (entget ssn))
      (if (=(cdr(assoc 66 ent)) 1)
	(progn
	  (setq i 0)
	  (setq ssn2 (entnext ssn))
	  (setq ent2 (entget ssn2))
	  (setq n10 (reverse c10))
	  (setq n40 (reverse nc40))
	  (setq n41 (reverse nc41))
	  (setq n42 (reverse nc42))
	  (setq n70 (reverse c70))
	  (setq n50 (reverse c50))
	  (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	    (setq ent2 (subst (nth i n10) (nth i c10) ent2))
	    (setq ent2 (subst (cons 40 (cdr(nth i n41))) (nth i c40) ent2))
	    (setq ent2 (subst (cons 41 (cdr(nth i n40))) (nth i c41) ent2))
	    (setq ent2 (subst (cons 42 (- 0 (cdr(nth i n42)))) (nth i c42) ent2))
	    (setq ent2 (subst (nth i n70) (nth i c70) ent2))
	    (setq ent2 (subst (nth i n50) (nth i c50) ent2))
	    (entmod ent2)
	    (setq i (1+ i))
	    (setq ssn2 (entnext ssn2))
	    (setq ent2 (entget ssn2))
	    );end while
	  (entupd ssn)
	  );end progn
	);end if
      );end progn
    );end if
  );end progn
);end if
     );end progn
   );end if  
 (if (= (cdr(assoc 0 ent)) "LINE")
   (progn      
     (setq test0 (cdr(assoc 10 ent)))
     (if (equal dinh test0 0.00001)
(progn
  (setq c10 (assoc 10 ent))  
  (setq c11 (assoc 11 ent))
  (setq n10 (assoc 11 ent))
  (setq n11 (assoc 10 ent))
  (setq ent (subst (cons 10 (cdr n10)) c10 ent))
  (setq ent (subst (cons 11 (cdr n11)) c11 ent))
  (entmod ent)
  (entupd ssn)
  );end progn	
);end if
     );end progn
   );end if
 (if (= (cdr(assoc 0 ent)) "ARC")
   (progn
     (vl-cmdf "pedit" ss "y" "")
     (if (= (cdr(assoc 0 ent)) "POLYLINE")
   (progn
     (setq test1 (vlax-curve-getEndPoint ssn))
     (if (=(cdr(assoc 66 ent)) 1)
(progn
  (setq ssn2 (entnext ssn))
  (setq ent2 (entget ssn2))
  (setq test0 (cdr(assoc 10 ent2)))
  (if (equal dinh test1 0.00001)
    (progn
      (setq c42 (append c42 (list(cons 42 0))))
      (setq c40 (append c40 (list(cons 40 0))))
      (setq c41 (append c41 (list(cons 41 0))))
      (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	(setq c10 (append c10 (list(assoc 10 ent2))))
	(setq c40 (append c40 (list(assoc 40 ent2))))
	(setq c41 (append c41 (list(assoc 41 ent2))))
	(setq c42 (append c42 (list(assoc 42 ent2))))
	(setq c70 (append c70 (list(assoc 70 ent2))))
	(setq c50 (append c50 (list(assoc 50 ent2))))
	(setq ssn2 (entnext ssn2))
	(setq ent2 (entget ssn2))
	);end while
      (setq n (- (length c42) 2))
      (setq i 0)
      (while (<= i n)
	(setq nc42 (append nc42 (list(nth i c42))))
	(setq nc40 (append nc40 (list(nth i c40))))
	(setq nc41 (append nc41 (list(nth i c41))))
	(setq i (1+ i))
	);end while
      (setq i 1)
      (while (<= i n)
	(setq cc42 (append cc42 (list(nth i c42))))
	(setq cc41 (append cc41 (list(nth i c41))))
	(setq cc40 (append cc40 (list(nth i c40))))
	(setq i (1+ i))
	);end while
      (setq c42 nil c42 cc42 c41 nil c41 cc41 c40 nil c40 cc40)
      (setq ss (ssget "_P"))
      (setq ent (entget ssn))
      (if (=(cdr(assoc 66 ent)) 1)
	(progn
	  (setq i 0)
	  (setq ssn2 (entnext ssn))
	  (setq ent2 (entget ssn2))
	  (setq n10 (reverse c10))
	  (setq n40 (reverse nc40))
	  (setq n41 (reverse nc41))
	  (setq n42 (reverse nc42))
	  (setq n70 (reverse c70))
	  (setq n50 (reverse c50))
	  (While(/= (cdr(assoc 0 ent2)) "SEQEND")
	    (setq ent2 (subst (nth i n10) (nth i c10) ent2))
	    (setq ent2 (subst (cons 40 (cdr(nth i n41))) (nth i c40) ent2))
	    (setq ent2 (subst (cons 41 (cdr(nth i n40))) (nth i c41) ent2))
	    (setq ent2 (subst (cons 42 (- 0 (cdr(nth i n42)))) (nth i c42) ent2))
	    (setq ent2 (subst (nth i n70) (nth i c70) ent2))
	    (setq ent2 (subst (nth i n50) (nth i c50) ent2))
	    (entmod ent2)
	    (setq i (1+ i))
	    (setq ssn2 (entnext ssn2))
	    (setq ent2 (entget ssn2))
	    );end while
	  (entupd ssn)
	  );end progn
	);end if
      );end progn
    );end if
  );end progn
);end if
     );end progn
   );end if
     );end progn
   );end if
 (setvar "osmode" osmodec)
 (princ)
 )

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×