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

Lisp vẽ đường thẳng ( nối các điểm cuối của tập hợp các đường thẳng)

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

Em có các đoạn thẳng màu trắng như hình vẽ. Mong các bác hỗ trợ viết giúp em vẽ đoạn thẳng màu xanh (Lisp quét chọn các đoạn màu trắng, lisp sẽ nối các điểm cuối của các đoạn thẳng để vẽ ra đường thẳng màu xanh)

Em cảm ơn các bác nhiều

image.png

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

Vì không có bản vẽ nên bạn tự đặt thuộc tính các đoạn thẳng cần vẽ


(defun C:TOP ( / l p q)
    (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE"))))))
        (setq p (cdr (assoc 10 (entget e))) q (cdr (assoc 11 (entget e))))
        (setq l (cons (if (> (cadr p) (cadr q)) p q) l))
    )
    (setq l (vl-sort l ''((u v) (< (car u) (car v)))))
    (mapcar ''((u v) (entmakex (list '(0 . "LINE") (cons 10 u) (cons 11 v)))) l (cdr l))
)

  • 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
30 phút trước, ndtnv đã nói:

Vì không có bản vẽ nên bạn tự đặt thuộc tính các đoạn thẳng cần vẽ


(defun C:TOP ( / l p q)
    (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE"))))))
        (setq p (cdr (assoc 10 (entget e))) q (cdr (assoc 11 (entget e))))
        (setq l (cons (if (> (cadr p) (cadr q)) p q) l))
    )
    (setq l (vl-sort l ''((u v) (< (car u) (car v)))))
    (mapcar ''((u v) (entmakex (list '(0 . "LINE") (cons 10 u) (cons 11 v)))) l (cdr l))
)

Cho hỏi tí:

1. Tại sao viết '''((u v) thì tương đương với '(lambda(u v)   ?
2. Cách viết 1 ngoài ngắn gọn thì có gì ưu điểm so với cách viết dùng lambda? Và liệu lambda có phải là hàm thừa?

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
4 giờ trước, ketxu đã nói:

Sao nó k vẽ dưới chân mà lại vẽ trên đầu thế kia nhỉ ^^

Cái này giống như vẽ cắt dọc, cắt ngang địa hình đấy 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
33 phút trước, Doan Van Ha đã nói:

Cho hỏi tí:

1. Tại sao viết '''((u v) thì tương đương với '(lambda(u v)   ?
2. Cách viết 1 ngoài ngắn gọn thì có gì ưu điểm so với cách viết dùng lambda? Và liệu lambda có phải là hàm thừa?

Cách viết '''((u v) tôi copy của 1 member trên cadviet từ lâu rồi, vì ngắn hơn nên dùng thôi, cũng như '(1 2) ngắn hơn (list 1 2) vậy

 

  • 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
1 giờ} trướ}c, ndtnv đã nói:

Vì không có bản vẽ nên bạn tự đặt thuộc tính các đoạn thẳng cần vẽ


(defun C:TOP ( / l p q)
    (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE"))))))
        (setq p (cdr (assoc 10 (entget e))) q (cdr (assoc 11 (entget e))))
        (setq l (cons (if (> (cadr p) (cadr q)) p q) l))
    )
    (setq l (vl-sort l ''((u v) (< (car u) (car v)))))
    (mapcar ''((u v) (entmakex (list '(0 . "LINE") (cons 10 u) (cons 11 v)))) l (cdr l))
)

Anh có thể  hiệu chỉnh lisp thêm chức năng khi kéo đường màu trắng lên xuống thì đường màu xanh tự động cập nhật? Thanks!

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
37 phút trước, limfx đã nói:

Anh có thể  hiệu chỉnh lisp thêm chức năng khi kéo đường màu trắng lên xuống thì đường màu xanh tự động cập nhật? Thanks!

(setq ss (ssget ...))

.....

(setq lst (mapcar '.....))

(command "AUTOCONSTRAIN" (acet-list-to-ss lst)  ss "")

thế là xong

mà cái lệnh autoconstrain này dễ dùng lắm mắc gì phải viết lisp. Ông nào thích gán vào nhau thì tự gõ lệnh mà dùng.

  • Like 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
26 phút trước, ndtnv đã nói:

Cách viết '''((u v) tôi copy của 1 member trên cadviet từ lâu rồi, vì ngắn hơn nên dùng thôi, cũng như '(1 2) ngắn hơn (list 1 2) vậy

 

'(1 2) và (list 1 2) nó khác nhau là một bên thì các element bên trong là phần tử tường minh, còn một bên thì bên trong có thể tường minh hoặc là biến được lấy từ hàm setq.
Còn cách viết dùng 2 dấu phẩy trên này khó hiểu quá, và cũng mới gặp lần đầu.
Em "lambda" đang tự hỏi: sinh em ra làm gì cho dài dòng mà không dùng 2 dấu phẩy trên cho gọ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
12 phút trước, Doan Van Ha đã nói:

'(1 2) và (list 1 2) nó khác nhau là một bên thì các element bên trong là phần tử tường minh, còn một bên thì bên trong có thể tường minh hoặc là biến được lấy từ hàm setq.
Còn cách viết dùng 2 dấu phẩy trên này khó hiểu quá, và cũng mới gặp lần đầu.
Em "lambda" đang tự hỏi: sinh em ra làm gì cho dài dòng mà không dùng 2 dấu phẩy trên cho gọn?

 

Khi dùng '' và ' nhiều quá code đọc khó hiểu

Nên cách rút gọn chỉ cho người chuyên nghiệp. Em nghĩ vậy

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
1 giờ} trướ}c, NTHAHT đã nói:

Còn 1 cách khác, viết dài hơn: (function (lambda (u v) ...

Vẫn còn cách khác ạ: (mapcar (quote (lambda (u v)...

Hay: (mapcar (quote (quote ((u v)...

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
4 phút trước, limfx đã nói:

Khi dùng '' và ' nhiều quá code đọc khó hiểu

Nên cách rút gọn chỉ cho người chuyên nghiệp. Em nghĩ vậy

Khi người ta xây dựng 1 ngôn ngữ lập trình thì không có gì thừa đâu bạn. Chỉ là mình chậm hiểu thôi. Và chắc họ cũng không xây dựng cho người chuyên nghiệp và người kém chuyên nghiệp đâ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
14 phút trước, Doan Van Ha đã nói:

Khi người ta xây dựng 1 ngôn ngữ lập trình thì không có gì thừa đâu bạn. Chỉ là mình chậm hiểu thôi. Và chắc họ cũng không xây dựng cho người chuyên nghiệp và người kém chuyên nghiệp đâu.

thi thoảng đánh dấu '(lambda thì không đặt được break point phải viết về function.

Nhưng em thấy dùng lệnh chưa có khác gì nhau.

sau khi tra tài liệu thì với file *.lsp không có gì khác biệt tuy nhiên khi compile qua .fas hoặc  .vlx  thì viết tường minh sẽ oke hơn ạ

image.png.03741e29d31bf18df823aba9752e85c5.png

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
21 phút trước, tannguyen291 đã nói:

thi thoảng đánh dấu '(lambda thì không đặt được break point phải viết về function.

Nhưng em thấy dùng lệnh chưa có khác gì nhau.

sau khi tra tài liệu thì với file *.lsp không có gì khác biệt tuy nhiên khi compile qua .fas hoặc  .vlx  thì viết tường minh sẽ oke hơn ạ

image.png.03741e29d31bf18df823aba9752e85c5.png

Anh toàn viết '(lambda. Không hề viết (function (lambda. Nhưng khi chuyển qua vlx and fas đều không hề lỗi. Nên chưa hiểu lắm.
Còn dùng 2 dấu phẩy trên thì mù tịt luôn.

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

' là chú thích của VB cũng như một số ngôn ngữ khác. Sau dấu đó sẽ không được biên dịch. Với ide vlisp thì không bị gì vì nó được viết để phục vụ cho visual lisp. Nhưng với Vscode chắc phải cấu hình lại file json để nó hiể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

Như ở đây đánh '(lambda thì vscode hiểu nhưng đánh ''((u v) thì vscode không hiểu.

Mặc dù lisp vẫn chạy bình thường. Chỉ là không đặt được breakpoint thi thoảng '(lambda vẫn không đặt được breakpoint phải viết về function. không rõ

image.png.3aae72710d9899f35a28f9cfa038ef11.png

image.png.db55218bc19a6fe2c1cef34ecf2f2f7e.png

Đối với VLE cũng gặp tình trạng tương tự. 

image.png.d922f8bd50a159b279176a7b5452a186.png

Như vậy các dấu quote sẽ ảnh hưởng chủ yếu đến người viết lisp. 

Trình biên dịch cũng đã gặp lỗi với ''((u v) còn '(lambda không sao. 

image.png.2362b5dc943dc6694e24658051a02e2b.png

 

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
17 giờ trước, ndtnv đã nói:

Vì không có bản vẽ nên bạn tự đặt thuộc tính các đoạn thẳng cần vẽ


(defun C:TOP ( / l p q)
    (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "LINE"))))))
        (setq p (cdr (assoc 10 (entget e))) q (cdr (assoc 11 (entget e))))
        (setq l (cons (if (> (cadr p) (cadr q)) p q) l))
    )
    (setq l (vl-sort l ''((u v) (< (car u) (car v)))))
    (mapcar ''((u v) (entmakex (list '(0 . "LINE") (cons 10 u) (cons 11 v)))) l (cdr l))
)

Lisp chạy tốt rồi. 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

Nho viet lisp chenh cao.dwgimage.thumb.png.f710492fa02e27f6fe47e4a9069bd9c0.png

Vào lúc 10/11/2023 tại 08:34, 711a041092 đã nói:

 

image.png.b168959b70dc572698160737b8cbcb35.png

 

Em có 1 dãy thông số chênh cao (Hiệu số của cao độ thiết kế và cao độ tự nhiên).

Các bác giúp em viết lisp chọn các text chênh cao, chọn đường polyline màu đỏ (đường thiết kế) người dùng nhập thêm thông số a, b. Sau khi dùng lisp, text chênh cao sẽ di chuyển:

- Với chênh cao dương thì giá trị này sẽ nằm trên đường thế kế 1 khoảng a

- Với chênh cao âm thì giá trị này sẽ nằm trên đường thế kế 1 khoảng b. Có 2 tùy chọn, Tùy chọn 1 là giá trị chênh cao âm này vẫn giữ nguyên giá trị, Tùy chọn 2 là giá trị chênh cao âm này sẽ lấy giá trị trị tuyệt đối và nằm dưới đường thiết kế 1 khoảng b như hình vẽ.

Cảm ơn các bác nhiều

  • 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
12 phút trước, NTHAHT đã nói:

Lisp kiểu này chắc phải có cà phê, hêhêhê ...

hehe định nói mà bác đã nói rồi.

Lisp khó hoặc với mục đích cá nhân không phù hợp với đại đa số mọi ng. Thì cần cà phê rồi. :L

  • Like 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

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  

×