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

Viết lisp theo yêu cầu [phần 2]

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

Bạn chạy thử LISP : cộng (trừ) giá trị của Block thuộc tính.

chatt.jpg

tên lệnh : ChAtt (Change Attributes)

- chọn Block cần thay đổi

- chọn Tag thuộc tính tuơng ứng cần thay đổi

- nhập số gia (muốn trừ, nhập số âm)

- chọn đối tượng trên màn hình

 

File download : ChAtt.zip

Kiểm tra lại file gia_bach ơi, giải nén không được : No archives found

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
Kiểm tra lại file gia_bach ơi, giải nén không được : No archives found

Có lẽ do lỗi mạng. Mình đã down và giải nén được rồi

Cám ơn gia_bạch nhiều nhiều. Lisp quá tuyệt :cheers:

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
Đây là phần tiếp theo của topic Viết lisp theo yêu cầu, mời các bạn tiếp tục thảo luận.

Tôi đang làm CTCon: tạo một tập chọn mới (ssmoi2) qua việc sử dụng hàm (ssadd). nếu thoả mãn một đkiện thì thêm ptử của tập chọn cũ (ssmoi) vào tập chọn mới (ssmoi2):

(aa$) có dạng một list như sau: aa$ = (1245 4589 4321 ....) = các số real.

(ssmoi): là một tập chọn qua việc chon bằng hàm (ssget)

(lay-yi-230 ssmoi chon vitri): là CT con lấy ra toạ độ điểm chèn yi của ptử thứ (vitri) trong tập chọn (ssmoi).

Vậy mà tại sao tôi không thể tạo được (ssmoi2). Khi chạy thử đều báo (ssmoi2) = nil ? Giúp tôi với ! Thanhks

 

(DEFUN tim-entyname23 (/ num liy vitri sslen sslen1)

(setq num 0)

(setq chon "C")

(setq ssmoi2 nil)

(setq sslen (length aa$))

(repeat (- sslen 0)

(progn

(setq liy (nth num aa$))

(setq vitri 0)

(repeat sslen

(progn

(setq gtriai (lay-yi-230 ssmoi chon vitri))

(if (= gtriai liy) (ssadd (ssname ssmoi vitri) ssmoi2))

(setq ent (entget (ssname ssmoi2 num)))

(setq vitri (+ vitri 1))

)

)

(setq num (+ num 1))

))

 

)(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
Đây là phần tiếp theo của topic Viết lisp theo yêu cầu, mời các bạn tiếp tục thảo luận.

- Tôi lập một danh sách dạng dot (.) bằng hàm (cons) có dạng:

;(ss) là tập chọn đtượng qua hàm (ssget)

;(Entyname là tên ptử lấy theo (cdr (assoc -1 (entget ss)))

 

(SETQ APPE$ (1456 . Entyname1 458 . Entyname2 .....))

(SETQ PTU (CDR (ASSOC 458 APPE$)))

(SETQ THTIN (ENTGET PTU))

- Vậy tại sao khi thực hiện tôi không lấy ra được (entget) của phần tử Entyname2 ?

Mong bác Hoành cùng anh em giúp tôi với. 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
- Tôi lập một danh sách dạng dot (.) bằng hàm (cons) có dạng:

;(ss) là tập chọn đtượng qua hàm (ssget)

;(Entyname là tên ptử lấy theo (cdr (assoc -1 (entget ss)))

 

(SETQ APPE$ (1456 . Entyname1 458 . Entyname2 .....))

(SETQ PTU (CDR (ASSOC 458 APPE$)))

(SETQ THTIN (ENTGET PTU))

- Vậy tại sao khi thực hiện tôi không lấy ra được (entget) của phần tử Entyname2 ?

Mong bác Hoành cùng anh em giúp tôi với. Thanks !

bạn phải viết thế này mới đúng cú pháp:

(SETQ APPE$ '((1456 . Entyname1 )( 458 . Entyname2 .....)))

 

Còn dòng lệnh: (SETQ THTIN (ENTGET PTU)) có thể không hoạt động như bạn nghĩ.

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 chạy thử LISP : cộng (trừ) giá trị của Block thuộc tính.

chatt.jpg

tên lệnh : ChAtt (Change Attributes)

- chọn Block cần thay đổi

- chọn Tag thuộc tính tuơng ứng cần thay đổi

- nhập số gia (muốn trừ, nhập số âm)

- chọn đối tượng trên màn hình

 

File download : ChAtt.zip

 

a gia_bach ơi, a có thể viết giùm e lisp này mà có phép nhân đc ko? Nếu đc nữa thì e chỉ cần quan tâm đến tên tag thôi, miễn block nào mình chọn mà có tag đó là nó chạy đc. Cám ơn a 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

Nhờ các Bạn viết hộ cái lisp thực hiện công việc như sau: từ 1 đoạn thẳng có chiều dài bấy kỳ (đối tượng LINE), chia đoạn thẳng này thành n đoạn nhỏ, giá trị n sẽ được nhập trong quá trình chạy lisp.

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
Nhờ các Bạn viết hộ cái lisp thực hiện công việc như sau: từ 1 đoạn thẳng có chiều dài bấy kỳ (đối tượng LINE), chia đoạn thẳng này thành n đoạn nhỏ, giá trị n sẽ được nhập trong quá trình chạy lisp.

Thanks

CHIA đoạn thẳng cần gì lisp, dùng lệnh div là được 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

Có ai viết cho tôi đoạn LISP mà tạo ra các tỉ lệ khác nhau được không?

 

Ví dụ khi tạo ra một Dimension thi đã có sẵn là kiểu kiến trúc cho dấu.

Rồi còn Scale nữa.

Nói chung là Lisp tạo Dimension mà hay dùng.

Cảm ơn 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

Vẽ đường bao các đối tương.

Hầu hết cácccông việc của chúng làm đều xuất phất từ việc chọn đường bao.

Tôi có ý tưởng: Tự đông vẽ đường bao cho các đối tượng được chọn.

Mong các bạn giúp tôi thực hiện ý tưởng này.

Xin cám ơ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

@thachphathien1123: lệnh DIVIDE chỉ đánh dấu trên đoạn thẳng bằng các node thôi Bạn,thực chất nó cũng là 1 đoạn thẳng. Cái minhc cần là đoạn thẳng có chiều dài L, sau khi chi thì có n đoạn thẳng có L1+L2+...+Ln = L

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
@thachphathien1123: lệnh DIVIDE chỉ đánh dấu trên đoạn thẳng bằng các node thôi Bạn,thực chất nó cũng là 1 đoạn thẳng. Cái minhc cần là đoạn thẳng có chiều dài L, sau khi chi thì có n đoạn thẳng có L1+L2+...+Ln = L

Ban tien2005 sử dụng thử code sau :

(defun c:brln(/ dt n sp ep dis dis_unit ang)
(setq dt (car(entsel "\n Moi ban chon Line : ")))
(setq n (getint "\n So doan thang can chia tu Line ban dau :"))
(setq sp (vlax-curve-getstartpoint dt)
  ep (vlax-curve-getendpoint dt)
  dis (distance sp ep)
  dis_unit (/ dis n)
  ang (angle sp ep)
)
(setq sp (polar sp ang dis_unit))
(vl-cmdf "break" dt "_non" "f" (trans sp 0 1) "@") 
(Repeat (- n 2)
(setq sp (polar sp ang dis_unit))
(vl-cmdf "break" "L" "_non" "f" (trans sp 0 1) "@") 
)
)

@road :

1. Nhắc bạn : không được post 1 nội dung ở 2 topic

2. "Tự đông vẽ đường bao cho các đối tượng được chọn". Đối tượng : theo bạn hiểu như thế nào? Toàn bộ đối tượng à?

Vẽ đường bao cho từng đối tượng riêng rẽ hay sao? Mục đích của việc vẽ đường bao là gì? Bạn vui lòng nói rõ.

Chỉnh sửa theo Tue_NV

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ào mọi người. mình thường phải vẽ đường gióng và công việc cứ lặp đi lặp lại đến phát ngán, mọi người có thể cho mình tham khảo 1 lisp với nội dung như sau:

- có 2 đường thẳng (có thể // hoặc ko //) và n điểm ko nằm trên 2 đường thẳng này

- mình muốn viết 1 lisp mà khi gọi lệnh sẽ hỏi chọn đường thẳng thứ 1, sau đó hỏi chọn tiếp đường thẳng thứ 2, tiếp theo sẽ hỏi chọn điểm. rồi khi lần lượt mình bắt vào các điểm như đã nói lisp sẽ tự động vẽ các đường thẳng gióng từ điểm đã chọn đến vuông góc với đường thẳng thứ 1, đường thẳng này được giới hạn bởi đường thẳng thứ 1 và đường thẳng thứ 2 (nếu khi hỏi chọn đường thẳng thứ 2 mà mình ko chọn thì nó sẽ vẽ luôn từ điểm chọn đến vuông góc đường thẳng thứ 1)

- đường thẳng cần vẽ được lisp vẽ có thuộc tính theo layer hiện hà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
Chào mọi người. mình thường phải vẽ đường gióng và công việc cứ lặp đi lặp lại đến phát ngán, mọi người có thể cho mình tham khảo 1 lisp với nội dung như sau:

- có 2 đường thẳng (có thể // hoặc ko //) và n điểm ko nằm trên 2 đường thẳng này

- mình muốn viết 1 lisp mà khi gọi lệnh sẽ hỏi chọn đường thẳng thứ 1, sau đó hỏi chọn tiếp đường thẳng thứ 2, tiếp theo sẽ hỏi chọn điểm. rồi khi lần lượt mình bắt vào các điểm như đã nói lisp sẽ tự động vẽ các đường thẳng gióng từ điểm đã chọn đến vuông góc với đường thẳng thứ 1, đường thẳng này được giới hạn bởi đường thẳng thứ 1 và đường thẳng thứ 2 (nếu khi hỏi chọn đường thẳng thứ 2 mà mình ko chọn thì nó sẽ vẽ luôn từ điểm chọn đến vuông góc đường thẳng thứ 1)

- đường thẳng cần vẽ được lisp vẽ có thuộc tính theo layer hiện hành

LISP Vẽ đường Line vuông góc với đường thẳng đã chọn (Pline, Arc)và giới hạn trong 2 đường thẳng (nếu có).

Hy vọng đúng ý bạn.

(defun C:VeVG (/ obj1 obj2 ObjL pt1 pt2 spc ss1 ss2)
 ;|Ve line vuong goc voi duong thang
   By : Gia Bach, gia_bach @  www.CadViet.com             |;    
 (vl-load-com)  
 (defun AddLine(pt1 pt2)
   (vla-addLine spc
     (vlax-3D-point pt1)
     (vlax-3D-point pt2)))  

 (if (and
(princ "\nChon duong thang thu 1 : ")
(setq ss1 (ssget "+.:S:N" (list (cons 0 "*LINE,ARC"))))
(princ "\nChon duong thang thu 2 : "))
   (progn      
     (if (setq ss2 (ssget "+.:S:N" (list (cons 0 "LINE"))))
(setq obj2 (vlax-Ename->Vla-Object(ssname ss2 0))))
     (setq spc (vla-get-modelspace (vla-get-ActiveDocument(vlax-get-acad-object)))
    obj1 (vlax-Ename->Vla-Object(ssname ss1 0)))
     (while (setq pt1 (getpoint "\nChon diem : "))
(setq pt2 (vlax-curve-getClosestPointTo obj1 pt1 T))
(setq ObjL (AddLine pt1 pt2))
(if (and
      obj2 
      (setq pt1 (vlax-Invoke objL "IntersectWith" obj2 3))
      (not(vl-catch-all-error-p (vl-catch-all-apply 'vlax-3d-point pt1))))
  (vla-put-StartPoint ObjL (vlax-3D-point pt1))) ) ) )
 (princ))

  • 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 tien2005 sử dụng thử code sau :

(defun c:brln(/ dt n sp ep dis dis_unit ang)
(setq dt (car(entsel "\n Moi ban chon Line : ")))
(setq n (getint "\n So doan thang can chia tu Line ban dau :"))
(setq sp (vlax-curve-getstartpoint dt)
  ep (vlax-curve-getendpoint dt)
  dis (distance sp ep)
  dis_unit (/ dis n)
  ang (angle sp ep)
)
(setq sp (polar sp ang dis_unit))
(vl-cmdf "break" dt "_non" "f" (trans sp 0 1) "@") 
(Repeat (- n 2)
(setq sp (polar sp ang dis_unit))
(vl-cmdf "break" "L" "_non" "f" (trans sp 0 1) "@") 
)
)

Bác Tue_NV ơi, tôi đã down lisp về và dùng rồi (Acad 2008) nhưng sau khi chọn line, nhập số đoạn cần chia thì line ban đầu vẫn k chia thành từng đoạn (vẫn là 1 đoạn thẳng).Nhờ bác xem lại giùm!

Đây là dòng lệnh mà tôi đã nhập:

http://www.4shared.com/photo/adFcEccJ/lenh_lnbr.html

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ột việc nhỏ cần giúp đỡ:

:: Tính và điền lại cao độ theo phương thẳng đứng y, trên bản vẽ đã có các text ghi chú cao độ nhưng chưa đúng, cần sửa lại các text này

- B1. Bắt đầu khi gọi lệnh sẽ chọn tỉ lệ bản vẽ (tỷ lệ đứng y: nhập a theo tỉ lệ bản vẽ và bước nhập tỉ lệ thì chỉ cần nhập 1 lần, trong những lần chạy lệnh lần sau sẽ ko hỏi tỷ lệ nữa trừ khi load lại lisp)

- B2. Chọn 1 điểm gốc (cao độ gốc so sánh có tọa độ theo phương đứng là y0) cad yêu cầu chọn 1 text (là cao độ gốc so sánh đã có sẵn, ví dụ là text có giá trị là a0)

- B3. Chọn điểm thứ 1 (tọa độ theo phương đứng của điểm này là y1,lisp sẽ tính ra chênh lệch cao độ này so với cao độ gốc bằng y0-y1),sau đó chọn 1 text, lisp sẽ sửa lại text này thành cao độ điểm thứ 1 (giá trị text là a0-(y0-y1))

- B4. Chọn điểm thứ 2, là làm tương tự ....

.................................

( nếu các cao độ là âm thì khi tex cao độ sẽ có dạng "-b" còn cao độ dương thì để bình thường, không cần phải có dấu ")

 

Ps:

+ có thể cho mình lisp thay đổi chiều cao text: chọn 1 vùng(lisp tự lọc ra thành phần text), sau đó nhập giá trị cao text mới

+cảm ơn Gia Bach đã viết hộ lisp gióng đường thẳng. rất có ích cho mì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
Nhờ các Bạn viết hộ cái lisp thực hiện công việc như sau: từ 1 đoạn thẳng có chiều dài bấy kỳ (đối tượng LINE), chia đoạn thẳng này thành n đoạn nhỏ, giá trị n sẽ được nhập trong quá trình chạy lisp.

Thanks

LISP này tui viết lâu rồi, không biết bi giờ có "hết đát" chưa ? bạn test thử nhé :cheers:

Bạn xem ở đây : lisp chia Curve (LINE,ARC, PLINE và SPLINE hở)

  • 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 chạy thử LISP : cộng (trừ) giá trị của Block thuộc tính.

chatt.jpg

tên lệnh : ChAtt (Change Attributes)

- chọn Block cần thay đổi

- chọn Tag thuộc tính tuơng ứng cần thay đổi

- nhập số gia (muốn trừ, nhập số âm)

- chọn đối tượng trên màn hình

 

File download : ChAtt.zip

 

a gia_bach ơi, a có thể viết giùm e lisp này mà có phép nhân đc ko? Nếu đc nữa thì e chỉ cần quan tâm đến tên tag thôi, miễn block nào mình chọn mà có tag đó là nó chạy đc. Cám ơn a trước!

Chào tnmtpcfunnyzui

Trên những ý tưởng của anh gia_bach, Tue_NV đã viết code về Lisp Cộng trừ nhân chia giá trị thuộc tính của Block Attribute với 1 số

- Dựa trên tính chất cơ bản của phép cộng, trừ : Khi cộng hoặc trừ một số với số 0 thì kết quả là chính nó

a+0 = a

a-0 = a

- Dựa trên tính chất cơ bản của phép nhân, chia : Khi nhân hoặc chia một số với số 1 thì kết quả là chính nó

a x 1 = a

a : 1 = a

Các bạn có thể đọc thêm ở đây :

Bài viết số 90

 

ctnctag.jpg

Lisp thực hiện phép tính nhân chia trước, cộng trừ sau nếu giá trị trong box Cộng số hoặc trừ số khác 0 và giá trị trong box nhân số hoặc chia số khác 1

Qua đây, cho Tue_NV gửi lời cảm ơn chân thành đến anh gia_bach đã hỗ trợ cho Tue_NV viết đoạn Code này.

Cảm ơn anh gia_bach rất nhiều :cheers:

DownLoad Lisp file

  • 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

Em có yêu cầu này mong mấy cao thủ giúp đỡ. Em muốn viết 1 chương trình lisp có khả năng chỉnh sửa số liệu trực tiếp trong bản vẽ không thông qua các lệnh cad, chỉnh sửa từ vật thể 2d đến 3d. Không biết mấy cao thủ có thể giúp em không :cheers: .Em cũng muốn tự tay viết nhưng do em chỉ có quyển dạy Lisp tập 1 của Nguyễn Hữu Lộc thôi, không có quyển thứ 2, đã từng đọc mấy sách khác nhưng toàn sách dịch nên không hiểu đã rối còn rối thêm, có bác nào có sách của Nguyễn Hữu Lộc post cho em được khô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

Chào các bạn, do nhu cầu công việc mình muốn nhờ các bạn viết giúp lisp bật, tắt các đối tựợng cùng mà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
Chào tnmtpcfunnyzui

Trên những ý tưởng của anh gia_bach, Tue_NV đã viết code về Lisp Cộng trừ nhân chia giá trị thuộc tính của Block Attribute với 1 số

- Dựa trên tính chất cơ bản của phép cộng, trừ : Khi cộng hoặc trừ một số với số 0 thì kết quả là chính nó

a+0 = a

a-0 = a

- Dựa trên tính chất cơ bản của phép nhân, chia : Khi nhân hoặc chia một số với số 1 thì kết quả là chính nó

a x 1 = a

a : 1 = a

Các bạn có thể đọc thêm ở đây :

Bài viết số 90

 

ctnctag.jpg

Lisp thực hiện phép tính nhân chia trước, cộng trừ sau nếu giá trị trong box Cộng số hoặc trừ số khác 0 và giá trị trong box nhân số hoặc chia số khác 1

Qua đây, cho Tue_NV gửi lời cảm ơn chân thành đến anh gia_bach đã hỗ trợ cho Tue_NV viết đoạn Code này.

Cảm ơn anh gia_bach rất nhiều :cheers:

DownLoad Lisp file

Xin góp ý 1 chút.

Chưa test cụ thể đoạn code này nhưng tôi thấy phương pháp nhập liệu hơi phiền phức vì phải quan tâm đến hai Textbox. Theo tôi chỉ cần 1 Textbox cũng giải quyết được. Nhập dấu +-*/ trước và giá trị sau, khi đó căn cứ vào dấu hiệu phép tính (ký tự đầu tiên) chương trình sẽ thực hiện phép tính đối với giá trị nhập vào sau dấu phép tính.

Nếu cần tính toán với biểu thức (nhiều phép tính cùng 1 lúc) cũng có thể giải quyết được với 1 Textbox.

  • 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
Cho mình hỏi có LISP nào convert ARC và CIRCLE thành LINE ko vậy?

Câu hỏi lạ thật, không hiểu bạn hỏi thật hay hỏi cho vui.

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 hỏi lạ thật, không hiểu bạn hỏi thật hay hỏi cho vui.

Chắc không phải hỏi cho vui đâu. Mình đoán bạn này đang vướng khi thực hiện lệnh wipeout đây mà.

 

Nếu đúng vấn đề này thì mình có 1 đoạn lisp dùng thực hiện wipeout cho hình tròn này.

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

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

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

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

(Defun c:wpc ()

(command "undo" "be")

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

 

(Princ "\nHay chon CIRCLE :")

(setq XX (ssget '((0 . "CIRCLE"))))

 

(setq L 0)

(setq M (sslength XX))

(while (< L M)

(setq DT (ssname XX L))

(setq DT (entget DT))

(setq TAM (cdr (assoc 10 DT)))

(setq BANKINH (cdr (assoc 40 DT)))

 

(command ".polygon" "30" TAM "" BANKINH)

(command ".wipeout" "" "last" "y")

 

(setq L (1+ L))

)

 

(setvar "osmode" luubatdiem)

(command "undo" "end")

(Princ)

)

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

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

  • 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 hỏi lạ thật, không hiểu bạn hỏi thật hay hỏi cho vui.

cảm ơn bạn đã quan tâm!mình hỏi thật chứ không phải cho vui đâu!có 1 số LISP chỉ hiểu đối tượng là LINE thôi bạn!ví dụ LISP hatch maker của bác BEEMOVE!

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ách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×