Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
banbe0274

[ Yêu Cầu] viết lisp sơ họa

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

Nhờ các bác cao thủ và anh em trên diễn đàn đàn viết hộ em 1 lisp.

Dùng để sơ họa . Từ bình đồ địa hình em vạch 1 tuyến . Trên tuyến có nhiều góc.

Từ tim tuyến em lấy ra mỗi bên 50m em bo đường polyline kín. Em dùng extrim cắt các đối tượng bên ngoài( Em chỉ cần lấy bên trong. Nhờ các Bác viết hộ em 1 lisp đưa tất cả các góc và đường bình đồ về góc 0độ như kết quả ví dụ. Em Trân thành cám ơn các Bác.http://www.cadviet.com/upfiles/3/72353_vd_1_1.dwg

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

Nhờ các bác cao thủ và anh em trên diễn đàn đàn viết hộ em 1 lisp.

Dùng để sơ họa . Từ bình đồ địa hình em vạch 1 tuyến . Trên tuyến có nhiều góc.

Từ tim tuyến em lấy ra mỗi bên 50m em bo đường polyline kín. Em dùng extrim cắt các đối tượng bên ngoài( Em chỉ cần lấy bên trong. Nhờ các Bác viết hộ em 1 lisp đưa tất cả các góc và đường bình đồ về góc 0độ như kết quả ví dụ. Em Trân thành cám ơn các Bác.http://www.cadviet.c...2353_vd_1_1.dwg

Tôi đã đọc ví dụ của bạn và nhận thấy ví dụ bạn đưa ra rất đặc biệt, chứ không mang tính tổng quát. Vì vậy, tôi chỉ giúp bạn được 50%, còn 50% thì đợi bạn trả lời (hoặc bạn tự làm). Đó là tôi chỉ mới làm xong bước 1-3, còn bước 4 (bước duỗi thẳng) thì hỏi bạn mấy câu sau:

1). Khi đường đồng mức đi qua điểm góc thì duỗi theo thằng trước hay theo thằng sau?

2). Khi đường đồng mức nằm gọn trong đường bao nhưng lại cắt cả thằng trước và thằng sau thì duỗi kiểu gì?

Đây là lisp "thô" cho bạn:

(defun C:HA( / p1 lst pq pn obj1 obj2 lstp1 lstp2 ss q ent)
(vl-load-com)
(command "undo" "be")
(setq osm (getvar "osmode") cmd (getvar "cmdecho"))
(setq p1 (getpoint "\nChon diem dau tien: ") lst (list p1) pq p1)
(while (setq pn (getpoint "\nChon diem tiep theo: "))
 (grdraw p1 pn 3)
 (setq lst (cons pn lst) p1 pn))
(setq q (getpoint "\nChon diem dat ket qua cuoi cung: "))
(setvar "osmode" 0) (setvar "cmdecho" 0)
(LWPoly (reverse lst) 0)
(redraw)
(setq obj1 (car (vlax-invoke (vlax-ename->vla-object (entlast)) 'Offset 50)))
(setq obj2 (car (vlax-invoke (vlax-ename->vla-object (entlast)) 'Offset -100)))
(setq lstp1 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (vlax-vla-object->ename obj1)))))
(setq lstp2 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (vlax-vla-object->ename obj2)))))
(LWPoly (append lstp1 (reverse lstp2)) 1)
(setq ss (ssget "cp" (cons (car lstp2) (append lstp1 (reverse lstp2)))))
(command "copy" ss "" pq q)
(load "extrim.lsp")
(etrim (setq ent (entlast)) pq)
(setq lstp3 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))))
(command "erase" ent "")
(setvar "osmode" osm) (setvar "cmdecho" cmd)
(command "undo" "end")
(princ))
(defun LWPoly (lst cls)
(entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 cls))
                	(mapcar (function (lambda (p) (cons 10 p))) lst))))

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 Hà đã giúp em . 1.Ta lên duỗi theo thằng trước là tốt nhất Bác Ạ..

2.Tại điểm góc khi ta duỗi đường đồng múc có thể trùng và cắt nhau. Cái đó chắc chỉ có thể sửa bằng tay thôi bác ạ. Nếu Bác có các khác tối ưu hơn thì càng tốt. Bác giúp em nhé.Cám ơn 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 Hà đã giúp em . 1.Ta lên duỗi theo thằng trước là tốt nhất Bác Ạ..

2.Tại điểm góc khi ta duỗi đường đồng múc có thể trùng và cắt nhau. Cái đó chắc chỉ có thể sửa bằng tay thôi bác ạ. Nếu Bác có các khác tối ưu hơn thì càng tốt. Bác giúp em nhé.Cám ơn Bác.

Câu 1 thì OK, nhưng Bạn chưa hiểu câu hỏi thứ 2 của tôi. Giả sử khi bạn đã cắt xén theo 2 đường biên xong, khi đó tồn tại 1 đường đồng mức mà nó cắt từ 2 đường trục trở lên thì đường đồng mức này sẽ được duỗi theo kiểu 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

Nhờ các bác cao thủ và anh em trên diễn đàn đàn viết hộ em 1 lisp.

Dùng để sơ họa . Từ bình đồ địa hình em vạch 1 tuyến . Trên tuyến có nhiều góc.

Từ tim tuyến em lấy ra mỗi bên 50m em bo đường polyline kín. Em dùng extrim cắt các đối tượng bên ngoài( Em chỉ cần lấy bên trong. Nhờ các Bác viết hộ em 1 lisp đưa tất cả các góc và đường bình đồ về góc 0độ như kết quả ví dụ. Em Trân thành cám ơn các Bác.http://www.cadviet.c...2353_vd_1_1.dwg

Hề hề hề,

Bạn dùng thử cái này coi đã đúng ý chưa nhé. Kết quả vẫn còn một số râu thừa do lệnh extrim của express. Mình chưa tìm ra cách xử lý. Bạn có thể xóa thủ công nó một tí. Hy vọng rằng nó có ích cho bạn.



(defun c:sht (/ tt lsp lsp0 lse al e0 e1 e2 e3 e4 en lsp1 ss ssl ss1 p pd oldos )
(VL-LOAD-COM)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq tt (car (entsel "\n Chon tim tuyen"))
         lsp (acet-geom-vertex-list tt)
         lsp0 (vl-remove (last lsp) (cdr lsp)) 
         ;;; e0 (entlast)  
         lse (list tt)  )
(foreach pt lsp0
        (command "break" tt pt pt)
        (setq lse (cons (entlast) lse) 
                  tt (entlast)  )
)
(setq lse (reverse lse))
(load "extrim.lsp")
(foreach tt lse
(setq al (* 180 (/ (angle (setq pd (vlax-curve-getstartpoint tt)) (vlax-curve-getendpoint tt)) pi))  )
(command "offset" 50 tt (list (+ (car pd) 50) (+ (cadr pd) 50)) "")
(setq e1 (entlast))
(command "offset" 50 tt (list (- (car pd) 50) (- (cadr pd) 50)) "")
(setq e2 (entlast))
(command "pline" (vlax-curve-getstartpoint e1) (vlax-curve-getstartpoint e2) "")
(setq e3 (entlast))
(command "pline" (vlax-curve-getendpoint e1) (vlax-curve-getendpoint e2) "")
(setq e4 (entlast))
(command "pedit" e3 "j" e1 e4 e2 "" "")
(setq en (entlast)
         lsp1 (acet-geom-vertex-list en))
(command "zoom" "e")
(setq ss (ssget "cp" lsp1))
(setq ssl (acet-ss-to-list ss))
(foreach e ssl
     (if (and (member e lse) (not (equal e tt)))
         (setq ssl (vl-remove e ssl))
     )
)
(setq ss (acet-list-to-ss ssl))
(setvar "osmode" 1)
(command "copy" ss "" pd (setq p (getpoint pd "\n Chon diem dat")))
(setvar "osmode" 0)
(etrim (setq e0 (entlast)) (list (+ (car p) 1000) (+ (cadr p) 1000)))
(command "erase" en  e0 "")
(setq ss1 (ssadd))
(while (setq en1 (entnext en)) (setq ss1 (ssadd en1 ss1) en en1)  )
(command "rotate" ss1 "" p (- al) )
;;;;(command "erase" (entlast) "")
(command "zoom" "p")
)
(command "pedit" (car lse) "j" (acet-list-to-ss (cdr lse)) "" "")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

Chúc bạn vui.

PS: Sau một hồi mày mò, mình đã khắc phục được các râu thừa đồng thời cũng giải quyết joint lại cái polyline tim tuyến để không làm thay đổi bản vẽ ban đầu của bạn.

Hãy lưu ý vài điểm sau đây khi sử dụng lisp này:

1/- Đường tim tuyến phải là đường Lwpolyline và phải được vẽ trước bạn nhé (Bạn phải dùng lệnh pline của CAD để vẽ đường tim tuyến này). Sở dĩ vậy vì trong lisp có sử dụng lệnh break mà thằng này lại có cái cách làm khác nhau giữa Lwpolyline và Polyline bạn ạ.

Điều này có khác với lisp của bác DoanVanHa vì bác ấy cho bạn pick điểm để tạo polyline.

2/- Khoảng cách offset mặc định là 50 như bạn yêu cầu, Nếu cần khoảng cách khác thì bạn phải thay đổi các giá trị 50 này trong các dòng lệnh offset cho phù hợp. Khi đó bạn cũng cần lưu ý thay đổi cái khoảng cách nhập điểm trong lệnh etrim kẻo nó cắt nhầm đó.(các giá trị 1000. Điều này có khác một chút với bác DoanVanHa vì bác ấy chọn một điểm luôn có thể đảm bảo là nằm ngoài do chắc rằng chả bao giờ bạn lại muốn đặt cái hình kết quả ở trong vùng bản vẽ cũ cả, nó sẽ rất khó nhòm.

3/- Để đảm bảo các đoạn hình cắt ra được nối lại liên tục thì bạn lưu ý khi lisp yêu cầu chọn điểm đặt bạn hãy sử dụng truy bắt điểm là end và zoom lớn đoạn liền trước nó rồi pick vào đầu mút bên phải của đoạn thẳng tim đường.(trừ lần chọn điểm đầu tiên)

 

Mình đã cập nhật các thay đổi vào lisp bên trên, bạn hảy thử dùng và cho biết ý kiến nhé. Nếu cần sửa đổi gì hãy post lên nhé.

Hề hề hề,..

PS: @ Banbe0274: Khi bạn chạy lisp nên chọn các điểm đăt cách nhau một khoảng đủ lớn để tránh việc bị ẽtrim nhầm các đối tượng không cần extrim bạn nhé. Tuy nhiên như vậy sẽ mất công move chùng lại cho liền nhau như mô tả của bạn.

Trường hợp hướng của đường tim từ phải qua trái, sau khi bạn đã có kết quả nếu muốn có thể dùng lệnh rotate để quay nó đi 180 độ cho gần giống với bản vẽ gốc bạn nhé.

Chỉnh sửa theo phamthanhbinh
Chỉnh sửa lại lisp theo một số góp ý của bác DoanVanHa
  • 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âu 1 thì OK, nhưng Bạn chưa hiểu câu hỏi thứ 2 của tôi. Giả sử khi bạn đã cắt xén theo 2 đường biên xong, khi đó tồn tại 1 đường đồng mức mà nó cắt từ 2 đường trục trở lên thì đường đồng mức này sẽ được duỗi theo kiểu gì?

Hề hề hề,

Mình hiểu ý bạn ấy là chả co duỗi gì cả mà chỉ đơn giản là xoay cả cái đống đường đồng mức này đi cùng với đườing tim một góc nào đó để đường tim nằm song song trục hoành thôi bác ạ. Khúc tim nào thì các đường đồng mức cắt nó sẽ bị xoay theo tim đó. Chả biết hiểu như vậy có trúng không nữa ????

Hề hề hề,..

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ề hề,

Mình hiểu ý bạn ấy là chả co duỗi gì cả mà chỉ đơn giản là xoay cả cái đống đường đồng mức này đi cùng với đườing tim một góc nào đó để đường tim nằm song song trục hoành thôi bác ạ. Khúc tim nào thì các đường đồng mức cắt nó sẽ bị xoay theo tim đó. Chả biết hiểu như vậy có trúng không nữa ????

Hề hề hề,..

Bác PTB ơi! Có những đường đồng mức sau khi trim xong nó còn dài đến nỗi cắt tới vài ba khúc tuyến, lại có ĐĐM nó không cắt nhưng nằm trải trên nhiều khúc tuyến khác nhau, nên mới hỏi là quay theo khúc nào, nhưng hình như tôi đã nhớ mang mang ra y/c này ở đâu đó đã gặp. Bác đã làm xong thì OK rồi.

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ác Bình đúng với công việc của em rồi. Cám ơn Bác nhé chúc các Bác trong ban quản trị diễn đàn 1 năm mới an khang thịnh vượng đạt và được nhiều thành công trong cuộc sống.

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 tham gia cũng được nhiều bài viết rồi. Nhắc bạn là cám ơn nên dùng nút LIKE như thế thể hiện sự biết luật chơi hơn, và thiết nghỉ ai đã giúp thì nên được LIKE mặc dù số lần được LIKE nhiều thì cũng chả có thêm quyền lợi thiết thực nào chẳng qua để thấy rằng time mình bỏ ra viết phản hồi là ko vô ích đối với người đặt câu hỏ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

Hề hề hề,

Bạn dùng thử cái này coi đã đúng ý chưa nhé. Kết quả vẫn còn một số râu thừa do lệnh extrim của express. Mình chưa tìm ra cách xử lý. Bạn có thể xóa thủ công nó một tí. Hy vọng rằng nó có ích cho bạn.



(defun c:sht (/ tt lsp lsp0 lse al e0 e1 e2 e3 e4 en lsp1 ss ssl ss1 p pd )
(VL-LOAD-COM)
(command "undo" "be")
(setq tt (car (entsel "\n Chon tim tuyen"))
         lsp (acet-geom-vertex-list tt)
         lsp0 (vl-remove (last lsp) (cdr lsp))
         ;;; e0 (entlast)  
         lse (list tt)  )
(foreach pt lsp0
    	(command "break" tt pt pt)
    	(setq lse (cons (entlast) lse)
              	tt (entlast)  )
)
(setq lse (reverse lse))

(foreach tt lse
(setq al (* 180 (/ (angle (setq pd (vlax-curve-getstartpoint tt)) (vlax-curve-getendpoint tt)) pi))  )
(command "offset" 50 tt (list (+ (car pd) 50) (+ (cadr pd) 50)) "")
(setq e1 (entlast))
(command "offset" 50 tt (list (- (car pd) 50) (- (cadr pd) 50)) "")
(setq e2 (entlast))
(command "pline" (vlax-curve-getstartpoint e1) (vlax-curve-getstartpoint e2) "")
(setq e3 (entlast))
(command "pline" (vlax-curve-getendpoint e1) (vlax-curve-getendpoint e2) "")
(setq e4 (entlast))
(command "pedit" e3 "j" e1 e4 e2 "" "")
(setq en (entlast)
         lsp1 (acet-geom-vertex-list en))
(command "zoom" "e")
(setq ss (ssget "cp" lsp1))
(setq ssl (acet-ss-to-list ss))
(foreach e ssl
     (if (and (member e lse) (not (equal e tt)))
         (setq ssl (vl-remove e ssl))
     )
)
(setq ss (acet-list-to-ss ssl))
(command "copy" ss "" pd (setq p (getpoint pd "\n Chon diem dat")))
(load "extrim.lsp")
(etrim (setq e0 (entlast)) (list (+ (car p) 1000) (+ (cadr p) 1000)))
(command "erase" en  e0 "")
(setq ss1 (ssadd))
(while (setq en1 (entnext en)) (setq ss1 (ssadd en1 ss1) en en1)  )
(command "rotate" ss1 "" p (- al) )
;;;;(command "erase" (entlast) "")
(command "zoom" "p")
)
(command "pedit" (car lse) "j" (acet-list-to-ss (cdr lse)) "" "")

(command "undo" "e")
(princ)
)

Chúc bạn vui.

PS: Sau một hồi mày mò, mình đã khắc phục được các râu thừa đồng thời cũng giải quyết joint lại cái polyline tim tuyến để không làm thay đổi bản vẽ ban đầu của bạn.

Hãy lưu ý vài điểm sau đây khi sử dụng lisp này:

1/- Đường tim tuyến phải là đường Lwpolyline và phải được vẽ trước bạn nhé (Bạn phải dùng lệnh pline của CAD để vẽ đường tim tuyến này). Sở dĩ vậy vì trong lisp có sử dụng lệnh break mà thằng này lại có cái cách làm khác nhau giữa Lwpolyline và Polyline bạn ạ.

Điều này có khác với lisp của bác DoanVanHa vì bác ấy cho bạn pick điểm để tạo polyline.

2/- Khoảng cách offset mặc định là 50 như bạn yêu cầu, Nếu cần khoảng cách khác thì bạn phải thay đổi các giá trị 50 này trong các dòng lệnh offset cho phù hợp. Khi đó bạn cũng cần lưu ý thay đổi cái khoảng cách nhập điểm trong lệnh etrim kẻo nó cắt nhầm đó.(các giá trị 1000. Điều này có khác một chút với bác DoanVanHa vì bác ấy chọn một điểm luôn có thể đảm bảo là nằm ngoài do chắc rằng chả bao giờ bạn lại muốn đặt cái hình kết quả ở trong vùng bản vẽ cũ cả, nó sẽ rất khó nhòm.

3/- Để đảm bảo các đoạn hình cắt ra được nối lại liên tục thì bạn lưu ý khi lisp yêu cầu chọn điểm đặt bạn hãy sử dụng truy bắt điểm là end và zoom lớn đoạn liền trước nó rồi pick vào đầu mút bên phải của đoạn thẳng tim đường.(trừ lần chọn điểm đầu tiên)

 

Mình đã cập nhật các thay đổi vào lisp bên trên, bạn hảy thử dùng và cho biết ý kiến nhé. Nếu cần sửa đổi gì hãy post lên nhé.

Hề hề hề,..

Bác Bình ơi! Tốt rồi. Nếu bác thêm tí mắm muối nữa thì càng tuyệt vời hơn:

- Đưa (load "extrim.lsp") lên đầu kẻo load hoài.

- Hướng vẽ: nếu pline trục đã vẽ từ phải qua trái thì ngược ngược khó coi.

- Điểm đặt bác nên chọn 1 lần thôi, lần sau có thể suy ra được mà!

- Khi đó bật tắt osnap luôn.

Thân thương!

  • 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 Bình ơi! Tốt rồi. Nếu bác thêm tí mắm muối nữa thì càng tuyệt vời hơn:

- Đưa (load "extrim.lsp") lên đầu kẻo load hoài.

- Hướng vẽ: nếu pline trục đã vẽ từ phải qua trái thì ngược ngược khó coi.

- Điểm đặt bác nên chọn 1 lần thôi, lần sau có thể suy ra được mà!

- Khi đó bật tắt osnap luôn.

Thân thương!

Hề hề hề,

Thanks bác đã tận tình hướng dẫn. Quả thực là mình vẫn suy nghĩ theo kiểu chắp vá của thằng đi mót nhiều lắm chứ chưa biệt kiểm soat theo hệ thống cống rãnh nào cả. Cứ căn cứ vào cái yêu cầu, rồi lục trong mớ hàng xén mình mót được, có cái chi xài được thì vác ra rồi ghép nó vô thôi nên nó chả được chặt chẽ, sáng sủa cho lắm.

Cái vụ (load extrim.lsp) ấy là mót của bác đấy, Thấy bác đặt ở trên thằng (etrim...... ) thì mình cũng cứ thế mà nhét vô chứ đâu có hiểu ngọn ngành như bác. Cứ tương là hễ etrim thì phải load thôi. Trước tới nay khi lisp có dùng thằng etrim thì mình thường chả có cái vụ load này mà. Nay bác đã dạy thì mình xin tiếp thu và sẽ sửa lại cho nó Chuẩn hỉ???

Cái hướng của pline thì mình cũng đã biết là khi vẽ đường tim từ phải qua trái thì cái hình cắt ra sẽ bị xoay lộn tu 180 độ. Song tại chủ thớt bảo xoay về góc 0 độ mà chả nói rõ là cần theo trật tự nào nên mình cứ cho về mo hết để chủ thớt tự xử thôi. (lẽ ra chỗ này chủ thớt phải nói rõ là 0 hay 180 đô tùy vào hướng của đường tim bác nhể )

Cái điểm đặt, đúng là từ lần thứ hai trở đi có thể cho tự chọn bằng cách lấy điểm cuối của đường tim trước. Xong mình nghĩ cứ để vậy để nhỡ đâu chủ thớt lại muốn lấy thành các khúc riêng biệt thì cứ thế mà mần, còn muốn nối thì mình đã hướng dẫn trong bài post. Tuy hơi loằng ngoằng nhưng có nhẽ nó đa dụng hơn bác nhể.

Việc bật tắt osnap đúng là mình hay bỏ qua thằng cu này và đã nhiều lần ăn chưởng của nó. Vậy mà vẫn chửa tỉnh đòn bác ạ. Cám ơn bác nhắc nhở.Mình sẽ lưu tâm hơn về thằng cu này và sẽ chỉnh sửa vào bài post sau bác nhé.

Mong bác luôn mạnh khỏe để giúp đỡ được nhiều cho mình và các anh em khác trên diễn đàn.

Hề hề hề,....

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
Đăng nhập để thực hiện theo  

×