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

(Góp ý) Chèn Block lên đỉnh PLine

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

Em biết hiện nay có rất nhiều lisp thực hiện được việc này một cách đơn giản và chắc diễn đàn cũng có nhiều bác đã viết vấn đề này rồi có vấn đề gì mong các chú các bác bỏ qua ạ. Thành quả nghiên cứu của em đây ạ, có gì mong các bác đóng góp để e điều chỉnh cho phù hợp ít lỗi hơn ạ

<

(defun c:CB (/ NP NB TD N TDA DC)
  ;; Chon Block
  (setq BN (cdr (assoc 2 (entget (car (entsel "\nChon Block muon chen:"))))))
  ;; Chon pline
  (setq PN (car (entsel "\nChon Pline muon chen: ")))
  ;; Lay toa do dinh Pline
      (setq TD (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget PN))))
  ;; Chen Block
      (setq N 0)
      (foreach TDA TD
        (setq DC (list (car TDA) (cadr TDA) 0.0))
        (command "_.insert" BN DC 1.0 1.0 0.0)
        (setq N (+ 1 N))
      )
      (princ (strcat "\nDa chen " (itoa N) " blocks len pline."))
  (princ)
  )>

Chỉnh sửa theo MaiLinh2006
viết thiếu tiê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

Chẳng lỗi gì, viết rõ ràng súc tích dễ hiểu.

Tuy nhiên không phù hợp với DynamicBlock, vì khi đã thay đổi parameter thì DXF 2 không còn phản ánh block name.

Với code ngắn, bạn nên đưa trực tiếp lên Mã <> cho ae khỏi phải mở file.

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

Chẳng lỗi gì, viết rõ ràng súc tích dễ hiểu.

Tuy nhiên không phù hợp với DynamicBlock, vì khi đã thay đổi parameter thì DXF 2 không còn phản ánh block name.

Với code ngắn, bạn nên đưa trực tiếp lên Mã <> cho ae khỏi phải mở file.

Vâng bác e sẽ rút kinh nghiệm lần sau

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

Theo mình:

-Đã chọn block trực tiếp thì dùng lệnh copy nó sẽ giữ nguyên các thông số như tỉ lệ, layer, góc của block mẫu chứ ko insert ra theo tỉ lệ 1 1 và layer hiện hành như bây giờ.

-Muốn insert thì đẩy danh sách block có trong bản vẽ hoặc chọn file dwg ngoài vào.

  • 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àm lấy tên Block nên sửa thành: (vì có thể lỗi như bác Cường nói)

(setq BN (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nChon Block muon chen:")))))

Vì lisp dùng command insert nên cần thêm bật tắt bắt điểm

(setq snap (getvar "OSMODE"))
(setq otho (getvar "ORTHOMODE"))
(setvar "OSMODE" 0)
(setvar "ORTHOMODE" 0)
;;;
(command "INSERT" ......)
;;;
(setvar "OSMODE" snap)
(setvar "ORTHOMODE" otho)

 

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
16 phút trước, Duong Nhat Duy đã nói:

Hàm lấy tên Block nên sửa thành: (vì có thể lỗi như bác Cường nói)


(setq BN (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nChon Block muon chen:")))))

Vì lisp dùng command insert nên cần thêm bật tắt bắt điểm


(setq snap (getvar "OSMODE"))
(setq otho (getvar "ORTHOMODE"))
(setvar "OSMODE" 0)
(setvar "ORTHOMODE" 0)
;;;
(command "INSERT" ......)
;;;
(setvar "OSMODE" snap)
(setvar "ORTHOMODE" otho)

 

cảm ơn các bác đã góp ý ạ

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

Theo mình:

-Đã chọn block trực tiếp thì dùng lệnh copy nó sẽ giữ nguyên các thông số như tỉ lệ, layer, góc của block mẫu chứ ko insert ra theo tỉ lệ 1 1 và layer hiện hành như bây giờ.

-Muốn insert thì đẩy danh sách block có trong bản vẽ hoặc chọn file dwg ngoài vào.

Chuẩn luôn đó bạn, nếu đã chọn block nên copy hay hơn. Insert thì lúc lấy dữ liệu từ file data bên ngoà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
48 phút trước, Duong Nhat Duy đã nói:

(setq BN (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nChon Block muon chen:")))))

Bác cứ để cho các cháu dùng thành thạo lisp đi đã. nhảy vào visual lisp là hơi nhức nhức cái đầu :))

dùng coppy là được rồi 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
1 giờ} trướ}c, tannguyen291 đã nói:

Bác cứ để cho các cháu dùng thành thạo lisp đi đã. nhảy vào visual lisp là hơi nhức nhức cái đầu :))

dùng coppy là được rồi mà.

em nghỉ vài hôm để tiêu hóa kiến thức đây bác ơi :(((((((((((

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

(setq TD (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget PN))))

Mới học 1 ngày mà hiểu được phần này thì cũng oách xà lách quá :D Tiềm nă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
16 phút trước, ketxu đã nói:

Mới học 1 ngày mà hiểu được phần này thì cũng oách xà lách quá :D Tiềm năng
  

em mất 1 năm mới hiểu được cái tổ hợp mapcar lambda còn xa xa chưa đến vl-remove-if :))

em nghĩ đến mai khéo các cháu học đến vlax-invoke 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

Nói cho vuông: tay này nếu không học lisp lâu rồi thì chỉ có thể lấy lisp của người ta sửa lại mà thôi (mà sửa lại được cũng đã học lâu 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

Mình tới giờ cũng chỉ biết áp dụng mapcar còn dính tới lambda thì chỉ có nước chôm cả đoạn của người khác làm hàm von dùng thôi. 

Năng lực học của các bạn trẻ có vẻ mạnh. Năm trước cơ quan mình có 1 bạn trẻ mò lisp có 1 tháng mà đã làm được (có tham khảo copy nhiều nơi) lisp thống kê thép từ các block động. Nể thật. Hồi mình có hỏi trên cadviet mình đoạn đọc thông tin từ block động í là hỏi giúp bạn ấy. Nền tảng là bạn ấy thời sinh viên đã biết lập trình 1 ngôn ngữ gì đó 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
16 giờ trước, duy782006 đã nói:

Mình tới giờ cũng chỉ biết áp dụng mapcar còn dính tới lambda thì chỉ có nước chôm cả đoạn của người khác làm hàm von dùng thôi. 

Năng lực học của các bạn trẻ có vẻ mạnh. Năm trước cơ quan mình có 1 bạn trẻ mò lisp có 1 tháng mà đã làm được (có tham khảo copy nhiều nơi) lisp thống kê thép từ các block động. Nể thật. Hồi mình có hỏi trên cadviet mình đoạn đọc thông tin từ block động í là hỏi giúp bạn ấy. Nền tảng là bạn ấy thời sinh viên đã biết lập trình 1 ngôn ngữ gì đó rồi.

Cháu đang được 1 a khóa trên dạy lập trình dynamo trên nền tảng cv3D, cháu  thấy 2 cái này có nhiều tương đồng, về cách vận dụng dữ liệu kiểu chuỗi hay số. Để được cái hàm trên là cháu cũng đi hỏi kha khá người, hỏi google rồi tra sách, cũng có đi hỏi được 1 lisp tối ưu nhưng đang nghiên cứu vì chưa hiểu 

 

Chỉnh sửa theo MaiLinh2006
Đã hiểu
  • 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
17 giờ trước, tannguyen291 đã nói:

em mất 1 năm mới hiểu được cái tổ hợp mapcar lambda còn xa xa chưa đến vl-remove-if :))

em nghĩ đến mai khéo các cháu học đến vlax-invoke rồi :))

Tra google từng đoạn rồi nhờ các bác đi trước dịch rồi ví dụ các bác ơi@@, sao em thấy các bác nghĩ cao xa quá, hiện tại em mới chỉ đọc tới lambda kết hợp với vl-remove-if. Không các bác cứ bảo em thần đồng viết lisp. Ngoài cái tường gạch với cái đưa block vô đình pl e chưa nghĩ ra cái gì khác

 

image.thumb.png.6324a8b2c22b46c08509525df9efec94.png

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

image.png.1ed2b170c76fcb9f987e630d38be2c75.png

Không hiểu cái em này đang nghĩ gì, hỏi xin lisp mình gửi rồi lại show lên hỏi thiên hạ, bó tay!

Em xin lỗi bác, ý là có lisp này tối ưu hơn nhưng e chưa hiểu được hết nội dung trong này, có gì em sẽ xóa bà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
53 phút trước, MaiLinh2006 đã nói:

Cháu đang được 1 a khóa trên dạy lập trình dynamo trên nền tảng cv3D, cháu  thấy 2 cái này có nhiều tương đồng, về cách vận dụng dữ liệu kiểu chuỗi hay số. Để được cái hàm trên là cháu cũng đi hỏi kha khá người, hỏi google rồi tra sách, cũng có đi hỏi được 1 lisp tối ưu nhưng đang nghiên cứu vì chưa hiểu :

 (defun c:IBB ()
  (setq modelSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  (setq block (car (entsel "\nSeclect block: ")))
  (setq bo (vlax-ename->vla-object block))
  ;(setq pt (vlax-get bo 'InsertionPoint))
  (setq nameb (vlax-get bo 'EffectiveName))
  (setq pl (car (entsel "\nSeclect pline: ")))
  (setq plo (vlax-ename->vla-object pl))
  (repeat (setq n (1+ (fix (vlax-curve-getEndParam plo))))
    (setq lst (cons (vlax-curve-getPointatparam plo (setq n (1- n))) lst)) )
  (foreach li lst
    (vla-InsertBlock modelSpace (vlax-3d-point li) nameb 1 1 1 0)
  );foreach
  (princ "limfx")
);end

Quăng cái lisp lên forum rồi nói chưa hiểu. Vậy mục đích em là gì: nhờ (bắt) mọi người giải thích từng ký tự cho em ư?
Lời khuyên: học, nghiên cứu, chỗ nào chưa hiểu thì hỏi chỗ đó. Và đặc biệt là chẳng cần up mấy thứ trong sách làm gì cho loảng forum 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
4 phút trước, limfx đã nói:

Không hiểu cái em này đang nghĩ gì, hỏi xin lisp mình gửi rồi lại show lên hỏi thiên hạ, bó tay!

Lisp của bạn cũng đâu có gì ghê gớm đâu, bạn cũng từng share cái này rồi thì phải. 

Với một người mới học lisp bạn gửi cho 1 cái thuộc phạm trù object arx để làm khó người ta chứ chia sẻ kiến thức cái chi.

@MaiLinh2006 bạn quăng cái sách vào mặt tô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
5 phút trước, tannguyen291 đã nói:

Lisp của bạn cũng đâu có gì ghê gớm đâu, bạn cũng từng share cái này rồi thì phải. 

Với một người mới học lisp bạn gửi cho 1 cái thuộc phạm trù object arx để làm khó người ta chứ chia sẻ kiến thức cái chi.

@MaiLinh2006 bạn quăng cái sách vào mặt tôi. :((

Ý em là bạn ấy sao ko hỏi riêng mà đi hỏi lung tung quá. Chứ cái lisp trên cũng học từ a tannguyen291 và tham khảo từ các lisp khác chứ có sáng tạo gì đâ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
7 phút trước, Doan Van Ha đã nói:

Quăng cái lisp lên forum rồi nói chưa hiểu. Vậy mục đích em là gì: nhờ (bắt) mọi người giải thích từng ký tự cho em ư?
Lời khuyên: học, nghiên cứu, chỗ nào chưa hiểu thì hỏi chỗ đó. Và đặc biệt là chẳng cần up mấy thứ trong sách làm gì cho loảng forum nhé.

E thấy lisp hay thì e up lên nói là e đang nghiên cứu cái lisp này thôi. Cũng chẳng có dòng nào là em bắt hay  nhờ bác giải thích từng kí tự cả. Bác cũng từng tự học cũng từng tự hỏi những câu ngây ngô như e hiện tại thôi nên đừng tỏ thái độ khó chịu với đàn em làm gì cả. Em cũng cảm ơn anh limfx đã gửi tài liệu cho e tham khảo học tập, cũng xin lỗi a vì tự tiện up lisp của a lên. Còn các bác bên trên e cũng nói luôn e không phải thần đồng thần sắt hay học lisp lâu năm gì cả. Cái của e là e tự đọc sách seach google e cũng chẳng sửa đổi gì của ai cả nhé.

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

E thấy lisp hay thì e up lên...

Forum có tính public nên bạn cần cân nhắc khi up bài. Còn những thứ làm loảng forum thì chớ up lên làm 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

Các bác căng thẳng quá, phải ươm mầm để phát triển tài năng cho 4r chứ nhỉ :D.

 

Em lạc đề chút: AI giờ cũng phát triển, nên sẽ giúp ích rất nhiều cho các bạn thích lập trình. Các bác có chuyên môn ngó xem AI nó giải thích như này có đúng không nhé :)

 

Chức năng:
Code này tạo một lệnh AutoLISP có tên là IBB dùng để chèn khối (block) vào các điểm được định nghĩa bởi một polyline (đường nét).
Phân tích từng phần:
1.    (defun c:IBB () ... );end: Định nghĩa một lệnh AutoLISP có tên IBB (viết tắt của "Insert Block By Polyline").
2.    (setq modelSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))): Lấy đối tượng ModelSpace (không gian mô hình) của bản vẽ đang hoạt động.
3.    (setq block (car (entsel "\nSeclect block: "))): Yêu cầu người dùng chọn một khối bằng lệnh entsel, sau đó gán giá trị của khối được chọn cho biến block.
4.    (setq bo (vlax-ename->vla-object block)): Chuyển đổi tên khối block (dạng text) thành một đối tượng vla-object (object của Visual LISP Application Extension) và gán cho biến bo.
5.    (setq nameb (vlax-get bo 'EffectiveName)): Lấy tên hiệu quả (tên được sử dụng để chèn) của khối và gán cho biến nameb.
6.    (setq pl (car (entsel "\nSeclect pline: "))): Yêu cầu người dùng chọn một polyline bằng lệnh entsel và gán cho biến pl.
7.    (setq plo (vlax-ename->vla-object pl)): Chuyển đổi tên polyline pl thành đối tượng vla-object và gán cho biến plo.
8.    (repeat (setq n (1+ (fix (vlax-curve-getEndParam plo)))) ... ): Lấy số lượng điểm trên polyline bằng vlax-curve-getEndParam và tạo một danh sách lst chứa tọa độ của các điểm đó.
o    vlax-curve-getEndParam trả về tham số kết thúc của polyline.
o    fix lấy phần nguyên của tham số kết thúc.
o    1+ cộng 1 vào kết quả để tính số lượng điểm.
o    vlax-curve-getPointatparam plo n lấy điểm trên polyline tại tham số n.
o    cons thêm điểm lấy được vào đầu danh sách lst.
9.    (foreach li lst ... );foreach: Duyệt qua từng điểm li trong danh sách lst.
o    (vla-InsertBlock modelSpace (vlax-3d-point li) nameb 1 1 1 0): Chèn khối có tên nameb vào tọa độ của điểm li trong không gian mô hình modelSpace.
    vlax-3d-point li chuyển đổi điểm li thành đối tượng 3D.
    Các tham số 1, 1, 1, 0 là các tham số xoay và tỷ lệ của khối được chèn.
10.    (princ "limfx"): In ra màn hình dòng "limfx". Dòng này có thể được sử dụng để điều chỉnh lại vùng hiển thị của bản vẽ sau khi chèn khối.
Lưu ý:
•    Code này sử dụng các hàm vla- và vlax- để thao tác với đối tượng của Visual LISP Application Extension (VLA).
•    Code này có thể được điều chỉnh để thay đổi số lượng điểm trên polyline, các tham số xoay và tỷ lệ của khối được chèn.
Kết luận:
Code này cho thấy cách sử dụng AutoLISP để tự động chèn khối vào các điểm trên một polyline. Code này rất hữu ích trong việc tối ưu hóa quy trình thiết kế và tiết kiệm thời gian khi làm việc với khối trong AutoCAD.

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

×