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

Lisp nối Line thành Pline ?

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

Dạo trước mình thấy mấy cái lisp chuyển line, arc ... thành pline nhiều lắm nhưng do lúc đó mình cũng có viết cái tạm dùng đc nên kg quan tâm lắm. Nay thấy cần xét cả TH đối tượng là spline thì làm thế nào chuyển nó thành polyline hay region thì kg thấy đâu nữa. Tìm cũng chẳng có. Chắc mình tìm hơi dở nên chưa thấy.

Phiền các bác trên DĐ đã viết hay đã biết thì giúp mình cái lisp chọn nhiều đt cùng lúc trong đó có line, pline, arc, spline rồi chuyển nó thành polyline hay region. Nó lặp cho đến lúc nào trong ss (tập hợp chọn) kg thể tạo đc nữa thì thôi. Cám ơn các bác

Hề hề hề,

Đây là cái lisp chuyển Spline thành polyline mình mót từ diễn đàn, hình như của bác nguyenhoanh hay SSG chi đó mà mình không nhớ, bác dùng thử xem có đúng ý không nhé.


(defun C:s2p ()
(while (not (and
(setq lstSelection   (entsel "\nSelect Spline: "))
(setq sngSegment  (getdist "\nGet Segment Length: "))
(setq objSelection   (vlax-ename->vla-object (car
lstSelection)))
(wcmatch (vla-get-objectname objSelection) 

"AcDb2dPolyline,AcDbPolyline,AcDbLine,AcDbArc,AcDbSpline"
)
)
)
 (princ "\nError please select again: ")
)
(setq sngLength   (vlax-curve-getDIstAtParam objSelection
(vlax-curve-getEndParam objSelection)
 )
 sngDistance 0.0
)
(vl-cmdf "._pline" (vlax-curve-getpointatDist objSelection 0.0))  (repeat (fix (/ sngLength sngSegment))
 (vl-cmdf (vlax-curve-getpointatDist objSelection sngDistance))
 (setq sngDistance (+ sngDistance sngSegment))
)
(vl-cmdf (vlax-curve-getPointAtParam objSelection
 (vlax-curve-getEndParam objSelection)
)
""
)
)

Chúc bác luon khỏe và vui

  • Vote tăng 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

Cám ơn bác Bình. Ý mình muốn nó tạo từ nhiều loại đối tượng thành polyline hay region. Sau khi sd Lisp bác gởi thì mình nghĩ ra chỉ cần dùng Lisp đơn giản (command "_.region" ss "") thì đc liền. Đôi lúc cũng ngớ ngẩn.

Các bác cho mình hỏi, làm thề nào có thể lấy đc tọa độ bao của region, hình như nó kg có trong dũ liệu đối tượng thì phải, chỉ lấy đc gần đúng thôi phải kg. Mình thấy dữ liệu của nó chẳng thể hiểu đc. Bạn nào có thể lấy đc tọa độ của nó sao cho diện tích khi tính bằng tọa độ tương đương với cách tính cùa cad. Mình dùng tọa độ bao của nó vào mục đích khác nữa chứ kg riêng gì tính diện tích.

Cám ơn các bá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

Cám ơn bác Bình. Ý mình muốn nó tạo từ nhiều loại đối tượng thành polyline hay region. Sau khi sd Lisp bác gởi thì mình nghĩ ra chỉ cần dùng Lisp đơn giản (command "_.region" ss "") thì đc liền. Đôi lúc cũng ngớ ngẩn.

Các bác cho mình hỏi, làm thề nào có thể lấy đc tọa độ bao của region, hình như nó kg có trong dũ liệu đối tượng thì phải, chỉ lấy đc gần đúng thôi phải kg. Mình thấy dữ liệu của nó chẳng thể hiểu đc. Bạn nào có thể lấy đc tọa độ của nó sao cho diện tích khi tính bằng tọa độ tương đương với cách tính cùa cad. Mình dùng tọa độ bao của nó vào mục đích khác nữa chứ kg riêng gì tính diện tích.

Cám ơn các bác

Ý tưởng của bác không còn là ...GÁNH HÀNG RONG nữa mà nó đã trở thành ĐẠI...SIÊU... THỊ...TƯỞNG! Bởi vì Splin là đường cong bậc ba được tạo bởi vô cùng vô tận điểm.

Nếu dùng lệnh Measure chia đường spline ra làm nhiều phân đoạn đều nhau, mỗi phân đoạn có chiều dài 0.00000001 milimet thì trong mỗi phân đoạn ngắn ngủi đó đã có tới trên 2 tỷ tọa độ điểm.

  • 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

Hề hề, có 1 dấu tick Thanks, bạn tick vào đó là được mờ.

NgocSon hãy thử code này :

Bạn pick vào 1 trong các line, arc, pline nào đó -> là nó tự tìm các đoạn liên kết được để nối và các đoạn này có cùng tên layer. Tên Layer này được lấy theo đối tượng mà bạn đã pick. OK?

Đây là code

(defun c:nn (/ tdt ssdt sodt index)(defun ObjName (ssdt /)(cdr (assoc '0 (entget ssdt))))(defun MoPL (ssdt /)(= (cdr (assoc '70 (entget ssdt))) 0))(defun NoiPL (ssdt /)(if (MoPL ssdt)(command ".PEDIT" ssdt "J" tdt "" "X")))(defun NoiLC (ssdt /)(command ".PEDIT" ssdt "Y" "J" tdt "" "X"))(setq ent (car(entsel "\nPick vao 1 doi tuong de noi :")))(setqtdt (ssget "X"	(list        (assoc 8 (entget ent) )	) 	)sodt (sslength tdt)index 0)(repeat sodt(setqssdt (ssname tdt index)index (1+ index))(if (or (= (Objname ssdt) "LWPOLYLINE")(= (Objname ssdt) "POLYLINE"))(NoiPL ssdt))(if (or (= (Objname ssdt) "LINE") (= (Objname ssdt) "ARC"))(NoiLC ssdt)))(princ))

Hy vọng trúng ý của bạn

 

em thấy lisp này rất hay, em thường xuyên sử dụng, nhưng mà lisp này khi chọn layer nó lại nối toàn bộ các layer trong hết 1 bản vẽ, giờ em muốn các bác chỉnh lại giúp em là chỉ nối trong 1 vùng bản vẽ mình chọn thôi, cảm ơn các bá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
Ý tưởng của bác không còn là ...GÁNH HÀNG RONG nữa mà nó đã trở thành ĐẠI...SIÊU... THỊ...TƯỞNG! Bởi vì Splin là đường cong bậc ba được tạo bởi vô cùng vô tận điểm. Nếu dùng lệnh Measure chia đường spline ra làm nhiều phân đoạn đều nhau, mỗi phân đoạn có chiều dài 0.00000001 milimet thì trong mỗi phân đoạn ngắn ngủi đó đã có tới trên 2 tỷ tọa độ điểm.

Cám ơn bác đã có gợi ý. Trước đây đã có bạn trên cadviet biến một cái polyline chỉ gồm những cung tròn thành pline mà diện tích tương đương. Sau đó bạn ấy có thể bận quá nên kg tiếp tục với spline. Tuy nhiên, muốn làm đc chúng ta phải đặt ra một qui ước nào đó. VD tọa độ phải nằm về hai phía của spilne ...

À, mà đường cong bậc 3 biểu diễn spline đc hiểu như thế nào nhỉ, mình chưa hiểu rõ lắm, mong bạn giải thích thêm

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ưởng của bác không còn là ...GÁNH HÀNG RONG nữa mà nó đã trở thành ĐẠI...SIÊU... THỊ...TƯỞNG! Bởi vì Splin là đường cong bậc ba được tạo bởi vô cùng vô tận điểm.

Nếu dùng lệnh Measure chia đường spline ra làm nhiều phân đoạn đều nhau, mỗi phân đoạn có chiều dài 0.00000001 milimet thì trong mỗi phân đoạn ngắn ngủi đó đã có tới trên 2 tỷ tọa độ điểm.

Cho tôi hỏi tí: làm sao biết nó là đường cong bậc 3 mà không không phải là bậc khá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

Em chỉ cảm nhận theo cảm tính thôi bác ạ! Bậc 1 + Bậc 2 = Bậc 3, không biết có đúng không?

- Khi Spline chỉ đi qua hai điểm, nhìn nó giống như đường y= ax + b (Bậc 1)

- Khi Spline chỉ đi qua 3 điểm là các đỉnh của tam giác cân, nó giống như đồ thị đường cong y= ax2^ + bx + c (Bậc 2)

và giống như hai câu thơ:

"Cổng trường đại học cao vời vợi

Mười người leo tới chín người rơi"

- Khi Spline đi qua nhiều điểm nhìn nó đẹp lắm, bá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à đường cong bậc 3 biểu diễn spline đc hiểu như thế nào nhỉ, mình chưa hiểu rõ lắm, mong bạn giải thích thêm

ddddf.jpg

 

Đường Spline hay thật! Nó vô tư, chạy nhảy trong môi trường 3D y sì như 3Dpoly, lại còn cho người ta Covenrt để chuyển đổi thành Polyline mới vui chứ. Trong khi Polyline chỉ bó hẹp trong môi trường 2D, thì Spline tung tẩy làm đường dẫn để tạo tay vịn cầu thang 3D, thật là tuyệt vời > Xin cảm ơn Spline!

Code dưới đây là hình ảnh tóm tắt giải thuật Spline tự nhiên:

Không biết có liên quan đến công việc của bác TRUNGNGAMY không?

AutoCAD chỉ cho nhìn đến 0,00000001. Không biết độ chính xác của nó đạt tới bao nhiêu số thập phân các bác 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

ddddf.jpg

 

Đường Spline hay thật! Nó vô tư, chạy nhảy trong môi trường 3D y sì như 3Dpoly, lại còn cho người ta Covenrt để chuyển đổi thành Polyline mới vui chứ. Trong khi Polyline chỉ bó hẹp trong môi trường 2D, thì Spline tung tẩy làm đường dẫn để tạo tay vịn cầu thang 3D, thật là tuyệt vời > Xin cảm ơn Spline!

Code dưới đây là hình ảnh tóm tắt giải thuật Spline tự nhiên:

Không biết có liên quan đến công việc của bác TRUNGNGAMY không?

AutoCAD chỉ cho nhìn đến 0,00000001. Không biết độ chính xác của nó đạt tới bao nhiêu số thập phân các bác nhỉ?

 

Cám ơn bạn đã có những giải thích và minh họa sinh động. Mình cũng biết spline uốn lượn đẹp hơn polyline, có lẽ thế nên nó khó tiếp cận. Quả thật mình cũng rất muốn biết spline đã được vẽ theo qui luật như thế nào. Nếu kg có cad, chúng ta vẽ nó bằng cách thủ công đc kg. Ý nói có theo công thức kg, hay tùy bàn tay người thợ.

Mình chưa nhận đc gì từ cái bạn đưa lên ở trên "Code dưới đây là hình ảnh tóm tắt giải thuật Spline tự nhiên"

Thường công việc của mình chỉ cẩn đến 3 số lẽ 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

Cám ơn bạn đã có những giải thích và minh họa sinh động. Mình cũng biết spline uốn lượn đẹp hơn polyline, có lẽ thế nên nó khó tiếp cận. Quả thật mình cũng rất muốn biết spline đã được vẽ theo qui luật như thế nào. Nếu kg có cad, chúng ta vẽ nó bằng cách thủ công đc kg. Ý nói có theo công thức kg, hay tùy bàn tay người thợ.

Mình chưa nhận đc gì từ cái bạn đưa lên ở trên "Code dưới đây là hình ảnh tóm tắt giải thuật Spline tự nhiên"

Thường công việc của mình chỉ cẩn đến 3 số lẽ thôi.

Thông tin em đưa lên chỉ là là link dẫn đến hình ảnh minh họa. Em đã xóa code đó rồi, và cũng xóa luôn cả ảnh gốc (nhờ bác xóa giúp em code trong bài bác đã trích dẫn, em cảm ơn bác nhiều). Muốn tìm hiểu về Spline, bác hãy tìm kiếm theo cụm từ tóm tắt giải thuật Spline tự nhiên để truy cập vào gian hàng:

Đường cong spiline bậc 3

Đường spline vẽ đươc thủ công bằng giấy bút. Nét chữ, nét vẽ từ bàn tay chắc chắc khỏe vạm vỡ cho đến bàn tay mềm mại nhỏ nhắn xinh tươi đều tạo ra vẻ đẹp của spline, bác ạ!

Bác có thể vào "Đại siêu thị Google" để chiêm ngưỡng vẻ đẹp hùng vĩ, lộng lẫy và ...xa hoa trùng điệp của đề tài : “Nghiên cứu ứng dụng đường cong tham số B-Spline vào nhận dạng chữ số viết tay”.

Chúc bác khỏe và gặp vui nhiều!

  • 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

Hề hề, có 1 dấu tick Thanks, bạn tick vào đó là được mờ.

NgocSon hãy thử code này :

Bạn pick vào 1 trong các line, arc, pline nào đó -> là nó tự tìm các đoạn liên kết được để nối và các đoạn này có cùng tên layer. Tên Layer này được lấy theo đối tượng mà bạn đã pick. OK?

Đây là code

(defun c:nn (/ tdt ssdt sodt index)(defun ObjName (ssdt /)(cdr (assoc '0 (entget ssdt))))(defun MoPL (ssdt /)(= (cdr (assoc '70 (entget ssdt))) 0))(defun NoiPL (ssdt /)(if (MoPL ssdt)(command ".PEDIT" ssdt "J" tdt "" "X")))(defun NoiLC (ssdt /)(command ".PEDIT" ssdt "Y" "J" tdt "" "X"))(setq ent (car(entsel "\nPick vao 1 doi tuong de noi :")))(setqtdt (ssget "X"	(list        (assoc 8 (entget ent) )	) 	)sodt (sslength tdt)index 0)(repeat sodt(setqssdt (ssname tdt index)index (1+ index))(if (or (= (Objname ssdt) "LWPOLYLINE")(= (Objname ssdt) "POLYLINE"))(NoiPL ssdt))(if (or (= (Objname ssdt) "LINE") (= (Objname ssdt) "ARC"))(NoiLC ssdt)))(princ))

Hy vọng trúng ý của bạn

 

em thấy lisp này rất hay, em thường xuyên sử dụng, nhưng mà lisp này khi chọn layer nó lại nối toàn bộ các layer trong hết 1 bản vẽ, giờ em muốn các bác chỉnh lại giúp em là chỉ nối trong 1 vùng bản vẽ mình chọn thôi, cảm ơn các bá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ình có 2 đối tượng này mà không nối bằng lệnh Pedit được.

 

http://www.cadviet.com/upfiles/3/118851_arc_and_line_1.dwg

 

Mình cũng đang viết một lisp để nối các (0 . "*LINE,ARC") lại với nhau mà không cần sử dụng lệnh PEDIT.

Tuy nhiên mình đang bí về thuật toán. Sau khi chọn "một cục" đối tượng xong, mình không biết làm sao để sắp xếp các đối tượng theo kiểu "End to End", nghĩa là các đối tượng này "nối đuôi" nhau (các điểm có thể trùng nhau hoặc cách nhau một đoạn cho trước).

 

Mong được sự giúp đỡ của các bá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

Dùng hàm có tên là sapxep(ss kc) này, với ss là "một cục" của bạn , đoạn cách nhau cho trước là kc.

Kết quả ra 1 list gồm tên các phần tử trong "cái cục" của bạn nhưng theo thứ thự "nối đuôi" nhau.

 

 

(defun sapxep(ss kc / tm L1 L2 ng)
  (defun noithem(d v kc tr / tm tm1 obj)
    (if (setq tm (car (vl-remove nil
(mapcar '(lambda(x) (if (and (/= v (cadar x)) (or (equal d (car x) kc) (equal d (last x) kc))) x nil)) L1))))
      (if (or (and tr (equal d (car tm) kc)) 
     (and (not tr) (equal d (last tm) kc)))
(setq ng t tm1 (reverse tm))
(setq ng nil tm1 tm)))
  )
  ;;;
  (setq L1 (mapcar '(lambda(x) (list (vlax-curve-getStartPoint (setq obj (vlax-ename->vla-object x))) x
   (vlax-curve-getEndPoint obj))) (acet-ss-to-list ss))
L2 (list (car L1))
L1 (cdr L1))
  
  (while L1
    (if (setq tm (noithem (caar L2) (cadar L2) kc t))
      (setq L2 (cons tm L2) L1 (vl-remove (if ng (reverse tm) tm) L1)))
    (if (setq tm (noithem (last (last L2)) (cadr (last L2)) kc nil))
      (setq L2 (append L2 (list tm)) L1 (vl-remove (if ng (reverse tm) tm) L1))))
  (mapcar '(lambda(x) (cadr x)) L2)
)
 

 

 
  • 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ái này chỉ có thể sai khi bạn cho cái khoảng cách kc lớn hơn  chiều dài ngắn nhất của line,arc

Còn cái vụ tìm start hay end thi trong hàm noithem đã tính 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

Có vẻ hàm equal so sánh khoảng cách 2 điểm không đúng bằng hàm distance, sửa lại hàm noithem như sau :

 

 

(defun noithem(d v kc tr / tm tm1)
    (if (setq tm (car (vl-remove nil
(mapcar '(lambda(x) (if (and (/= v (cadar x))
    (or (<= (distance d (car x)) kc) (<= (distance d (last x)) kc))) x nil)) L1))))
      (if (or (and tr (<= (distance d (car tm)) kc)) 
     (and (not tr) (<= (distance d (last tm)) kc)))
(setq ng t tm1 (reverse tm))
(setq ng nil tm1 tm)))
  )

 

  • 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 :D :D

2 lúa cần 1 option nhưng không tìm thấy trong lisp, bác nào vui lòng chỉ giúp:

Mô tả option:

Khi gõ lệnh "nn" lisp sẽ tự tìm các line/polyline chưa được nối và nối chúng với nhau, người dùng không cần chỉ định line/polyline.

:D :D :D

  • 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

@sgcq :cái đó để khi khác ở topic khác, ở đây bạn polyline chỉ cần cái giải thuật thôi.

@polyline : không hiểu bạn cho kc=0 ở cái hình nào, nếu ở file doan van ha đưa lên thì dĩ nhiên không chạy được vì 3 đoạn đó tách rời ra mà, làm sao bằng kc=0 mà chạy được. Còn ở file bạn đưa thì chạy tốt. Bạn thử đưa thêm file khác xem sao.

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ình có 2 đối tượng này mà không nối bằng lệnh Pedit được.

 

http://www.cadviet.com/upfiles/3/118851_arc_and_line_1.dwg

 

Mình cũng đang viết một lisp để nối các (0 . "*LINE,ARC") lại với nhau mà không cần sử dụng lệnh PEDIT.

Tuy nhiên mình đang bí về thuật toán. Sau khi chọn "một cục" đối tượng xong, mình không biết làm sao để sắp xếp các đối tượng theo kiểu "End to End", nghĩa là các đối tượng này "nối đuôi" nhau (các điểm có thể trùng nhau hoặc cách nhau một đoạn cho trước).

 

Mong được sự giúp đỡ của các bác!

Hề hề hề,

Khi pedit thì nếu chọn cái lwpolyline đỏ trước cad sẽ bào lỗi là: The object is not parallel to the UCS.

Mặc dù mã 38 của lwpolyline này vẫn là 0.

Vì vậy mà nó không joint được. Bác thử flaten nó coi sao.

Command: _pedit Select polyline or [Multiple]:
 
Command: _pedit Select polyline or [Multiple]:

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ôi hiểu tại sao kc=0 mà không chạy dc rồi. vì khi bạn cho kc= 0 thì hai điểm phải tuyệt đối trùng lên nhau, thực tế nhiều khi mắt mình thấy trùng nhưng nó không trùng, distance giữa nó vẫn >0, do đó không chạy được. Khoảng cách kc là cái sai số tối thiểu để nó nối, bạn cho = 0 thì là bạn ép nó quá không cho nó thở, làm sao nó làm việc? :blink:

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

×