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

[Hỏi] Cùng nhau học LISP

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

Vấn đề đường tròn e cũng giải quyết tạm thế này..Còn những vấn đề kia vẫn vướng.Không những thế còn thêm 1 vấn đề là :e muoốn chọn nhiều pl chứ không phải chỉ thực hiện 1 lần.mong các bác giúp đỡ :(

(defun C:ffs ( / ent i elist ppl cen rad gocquay)
(BatDau)
(setq ent (car(entsel "\nHay chon duong PL : ")))
(setq i 0 
        elist (entget ent)) 
(if (zerop (getvar "CMDACTIVE")) (command "_select" ));Lay trang thai cmd de select khi thuc hien lenh khac
(command "_wp") 

;;;DUONG TRON
(if (= (cdr(assoc 0 elist)) "CIRCLE")
 (progn
 (setq cen (cdr (assoc 10 elist))
       rad (cdr (assoc 40 elist)) 
 )
 (repeat 360 
  (setq gocquay (polar cen (* i (/ pi 180)) rad)  ;thuc hien 360 lan,moi lan 1 do
           i (1+ i))
  (command (trans gocquay 0 1))
 )); else

;;;;;;;;pl
(repeat (length elist) 
  (setq ppl (nth i elist) 
           i (1+ i))
  (if (= (car ppl) 10) (command (trans (cdr ppl) 0 1)));Tranh UCS quay 
 )
 )
(command "")
;(command "_select" "A" ent)  ;-----> Dong nay e sai ma chua biet o dau 
(KetThuc)
)
;;;;;;;;;;;;;;;;;
(defun BatDau() 
(setq OldOs (getvar "osmode")
       Oldcmd (getvar "cmdecho")) 
(setvar "cmdecho" 0)
(setvar "osmode" 0)
)
(defun KetThuc() 
(setvar "osmode" OldOs) 
(setvar "cmdecho" Oldcmd)
(princ)
)

Bạn thay ssget xong dùng while duyệt qua từng pl thay vì dùng entsel

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ấn đề đường tròn e cũng giải quyết tạm thế này..Còn những vấn đề kia vẫn vướng.Không những thế còn thêm 1 vấn đề là :e muoốn chọn nhiều pl chứ không phải chỉ thực hiện 1 lần.mong các bác giúp đỡ :(

(defun C:ffs ( / ent i elist ppl cen rad gocquay)
(BatDau)
(setq ent (car(entsel "\nHay chon duong PL : ")))
(setq i 0 
        elist (entget ent)) 
(if (zerop (getvar "CMDACTIVE")) (command "_select" ));Lay trang thai cmd de select khi thuc hien lenh khac
(command "_wp") 

;;;DUONG TRON
(if (= (cdr(assoc 0 elist)) "CIRCLE")
 (progn
 (setq cen (cdr (assoc 10 elist))
       rad (cdr (assoc 40 elist)) 
 )
 (repeat 360 
  (setq gocquay (polar cen (* i (/ pi 180)) rad)  ;thuc hien 360 lan,moi lan 1 do
           i (1+ i))
  (command (trans gocquay 0 1))
 )); else

;;;;;;;;pl
(repeat (length elist) 
  (setq ppl (nth i elist) 
           i (1+ i))
  (if (= (car ppl) 10) (command (trans (cdr ppl) 0 1)));Tranh UCS quay 
 )
 )
(command "")
;(command "_select" "A" ent)  ;-----> Dong nay e sai ma chua biet o dau
(KetThuc)
)
;;;;;;;;;;;;;;;;;
(defun BatDau() 
(setq OldOs (getvar "osmode")
       Oldcmd (getvar "cmdecho")) 
(setvar "cmdecho" 0)
(setvar "osmode" 0)
)
(defun KetThuc() 
(setvar "osmode" OldOs) 
(setvar "cmdecho" Oldcmd)
(princ)
)

Hề hề hề,

Cái dòng sai của bạn có nhẽ là do cái tham số "A" của lệnh select. Cái lệnh này mình đâu thấy có tham số chi đâu?????

Còn cái biến ent ở đây bạn lấy thế nào vậy???? Lấy từ đầu chương trì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ẳng là e muốn chọn cả thêm tập biên ý mà.Ent đúng là e lấy từ đầu chương trình :(

Còn lệnh Select có rất nhiều tham số mà ạ :(

Command: _select

 

Select objects: ?

 

 

*Invalid selection*

Expects a point or

Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/P

revious/Undo/AUto/SIngle/SUbobject/Object

  • 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
Chẳng là e muốn chọn cả thêm tập biên ý mà.Ent đúng là e lấy từ đầu chương trình :(

Còn lệnh Select có rất nhiều tham số mà ạ :(

Sao lệnh select của mình trả thấy tham số già nhể. Bạn dùng cad version bao 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

Thú thực với bác phamngoctukts là hnay cái này là cái đầu tiên e bắt đầu vào vòng lặp(vì e đã học lt đâu ^^),và ssget thì vẫn chưa biết dùng thành thạo :( Bác hướng dẫn cho e trong trường hợp này được k ạ?

E cứ tưởng thế này là được,nào ngờ chưa phải..Ssget trả về tập entity chọn đúng không ạ :).Vậy nó dạng ntn ạ ?

E sửa thế này rồi...sai be bét :( Dòng 1,2 có vấn đề e chưa biết.Tham khảo 1 số code e thấy chọn cả lwpolyline có nghĩa là j ạ,cóđiều gì khác biệt ạ

(defun C:ffs ( / i ilist elist ppl cen rad gocquay)
(BatDau)
(setq elist (ssget '((0 . "*POLYLINE"))));;;;;;;;;;;;;;;;;1
(while ((setq i 0) 
(if (zerop (getvar "CMDACTIVE")) (command "_select" ));Lay trang thai cmd de select khi thuc hien lenh khac
(command "_wp") 

;;;DUONG TRON
(if (= (cdr(assoc 0 elist)) "CIRCLE")
 (progn
 (setq cen (cdr (assoc 10 elist))
       rad (cdr (assoc 40 elist)) 
 )
 (repeat 360 
  (setq gocquay (polar cen (* i (/ pi 180)) rad)  ;thuc hien 360 lan,moi lan 1 do
           i (1+ i))
  (command (trans gocquay 0 1))
 )); else

;;;;;;;;pl
(repeat (length elist) 
  (setq ppl (nth i elist) 
           i (1+ i))
  (if (= (car ppl) 10) (command (trans (cdr ppl) 0 1)));Tranh UCS quay 
 )
 )
(command "")
(setq ilist (1+ ilist))
);ket thuc vong while
;(command "'fs" ent)
(KetThuc)
)
;;;;;;;;;;;;;;;;;
(defun BatDau() 
(setq OldOs (getvar "osmode")
       Oldcmd (getvar "cmdecho")) 
(setvar "cmdecho" 0)
(setvar "osmode" 0)
)
(defun KetThuc() 
(setvar "osmode" OldOs) 
(setvar "cmdecho" Oldcmd)
(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
Sao lệnh select của mình trả thấy tham số già nhể. Bạn dùng cad version bao nhiêu?

E dùng 2007,select xong "?" thì nó liệt kê đám option đấy ra ạ

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
Thú thực với bác phamngoctukts là hnay cái này là cái đầu tiên e bắt đầu vào vòng lặp(vì e đã học lt đâu ^^),và ssget thì vẫn chưa biết dùng thành thạo :( Bác hướng dẫn cho e trong trường hợp này được k ạ?

E cứ tưởng thế này là được,nào ngờ chưa phải..Ssget trả về tập entity chọn đúng không ạ :).Vậy nó dạng ntn ạ ?

E sửa thế này rồi...sai be bét :( Dòng 1,2 có vấn đề e chưa biết.Tham khảo 1 số code e thấy chọn cả lwpolyline có nghĩa là j ạ,cóđiều gì khác biệt ạ

(defun C:ffs ( / i ilist elist ppl cen rad gocquay)
(BatDau)
(setq elist (ssget '((0 . "*POLYLINE"))));;;;;;;;;;;;;;;;;1
(while (< ilist (sslength elist));;;;;;;;;;;;;;;;;;;;;;;;;;;;;2
(setq i 0) 
(if (zerop (getvar "CMDACTIVE")) (command "_select" ));Lay trang thai cmd de select khi thuc hien lenh khac
(command "_wp") 

;;;DUONG TRON
(if (= (cdr(assoc 0 elist)) "CIRCLE")
 (progn
 (setq cen (cdr (assoc 10 elist))
       rad (cdr (assoc 40 elist)) 
 )
 (repeat 360 
  (setq gocquay (polar cen (* i (/ pi 180)) rad)  ;thuc hien 360 lan,moi lan 1 do
           i (1+ i))
  (command (trans gocquay 0 1))
 )); else

;;;;;;;;pl
(repeat (length elist) 
  (setq ppl (nth i elist) 
           i (1+ i))
  (if (= (car ppl) 10) (command (trans (cdr ppl) 0 1)));Tranh UCS quay 
 )
 )
(command "")
(setq ilist (1+ ilist))
);ket thuc vong while
;(command "'fs" ent)
(KetThuc)
)
;;;;;;;;;;;;;;;;;
(defun BatDau() 
(setq OldOs (getvar "osmode")
       Oldcmd (getvar "cmdecho")) 
(setvar "cmdecho" 0)
(setvar "osmode" 0)
)
(defun KetThuc() 
(setvar "osmode" OldOs) 
(setvar "cmdecho" Oldcmd)
(princ)
)

Bạn phải dùng thế này

(setq elist (ssget '((0 . "*POLYLINE"))))

(setq i 0); gán i=0

(while (< i (sslength elist)); điều kiện i< số đối tượng trong tập chọn elist để vòng lặp kết thúc

(setq name (ssname elist i)); name chính là ename của đồi tượng thứ i trong tập chọn

muốn muốn biết tên đối tượng thứ i trong tập chọn selectionset thì dùng (assoc 0 (entget name)). tương tự lấy các thông số khác.

tiếp đến các hàm thao tác của bạn.

kết thúc dùng (setq i (1+ i)); sau mỗi lần lặp thì i tăng thêm 1 đến khi i= số đối tượng trong tập chọn thì vòng lặp kết thúc.

  • 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

E đã sửa nhưng bị thất bại bác ạ :( E bị lơ mơ đối tượng xử lý.E k biết xử lý thằng này

(setq name (ssname elist i)); name chính là ename của đồi tượng thứ i trong tập chọn
hay thằng elist của e :(,nên càng sửa càng lẫ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
Thú thực với bác phamngoctukts là hnay cái này là cái đầu tiên e bắt đầu vào vòng lặp(vì e đã học lt đâu ^^),và ssget thì vẫn chưa biết dùng thành thạo :( Bác hướng dẫn cho e trong trường hợp này được k ạ?

E cứ tưởng thế này là được,nào ngờ chưa phải..Ssget trả về tập entity chọn đúng không ạ :).Vậy nó dạng ntn ạ ?

E sửa thế này rồi...sai be bét :( Dòng 1,2 có vấn đề e chưa biết.Tham khảo 1 số code e thấy chọn cả lwpolyline có nghĩa là j ạ,cóđiều gì khác biệt ạ

(defun C:ffs ( / i ilist elist ppl cen rad gocquay)
(BatDau)
(setq elist (ssget '((0 . "*POLYLINE"))));;;;;;;;;;;;;;;;;1
(while ((setq i 0) 
(if (zerop (getvar "CMDACTIVE")) (command "_select" ));Lay trang thai cmd de select khi thuc hien lenh khac
(command "_wp") 

;;;DUONG TRON
(if (= (cdr(assoc 0 elist)) "CIRCLE")
 (progn
 (setq cen (cdr (assoc 10 elist))
       rad (cdr (assoc 40 elist)) 
 )
 (repeat 360 
  (setq gocquay (polar cen (* i (/ pi 180)) rad)  ;thuc hien 360 lan,moi lan 1 do
           i (1+ i))
  (command (trans gocquay 0 1))
 )); else

;;;;;;;;pl
(repeat (length elist) 
  (setq ppl (nth i elist) 
           i (1+ i))
  (if (= (car ppl) 10) (command (trans (cdr ppl) 0 1)));Tranh UCS quay 
 )
 )
(command "")
(setq ilist (1+ ilist))
);ket thuc vong while
;(command "'fs" ent)
(KetThuc)
)
;;;;;;;;;;;;;;;;;
(defun BatDau() 
(setq OldOs (getvar "osmode")
       Oldcmd (getvar "cmdecho")) 
(setvar "cmdecho" 0)
(setvar "osmode" 0)
)
(defun KetThuc() 
(setvar "osmode" OldOs) 
(setvar "cmdecho" Oldcmd)
(princ)
)

Chào bạn ketxu,

Bạn kiểm tra lại đoạn code này:

(repeat (length elist) ;;;;;;;;;; lặp với số bước lặp bằng số phần tử của tập chọn elist

(setq ppl (nth i elist) ;;;;;;;;; lấy phần tử thứ i của danh sách elist

i (1+ i))

(if (= (car ppl) 10) (command (trans (cdr ppl) 0 1)));Tranh UCS quay

)

)

 

Thực tế elist của bạn không phải là một list mà là một tên bộ chọn

Bạn hãy chú ý cái hàm ban đầu của bạn :

(setq elist (ssget '((0 . "*POLYLINE"))))

Hàm này trả về một bộ chọn có tên là quỷ quái chi chi đó gồm tất cả các đối tượng có mã dxf 0 là "*polyline".

Để biết tên của bộ chọn này, bạn phải xóa cái tên elist trong các biến cục bộ đi, rồi chạy lisp. Sau khi chạy xong bạn nhập !elist trên dòng command và enter sẽ thấy nó hiện ra. Còn nếu bạn vẫn để nó trong các biến cục bộ thì khi làm vậy bạn sẽ thấy nó trả về nil.

 

Do vậy cái hàm (length elist) của bạn là sai.

 

(setq ppl (nth i elist) Ở hàm này bạn định nghĩa ppl là một phần tử của elist nhưng có chắc phần tử này là một list hay không???? (thực tế thì không vì bạn chả có thằng ppl nào cả)

 

Và như vậy (car ppl) sẽ trả về phần tử đầu tiên của danh sách ppl mà cái này thì chưa chắc đúng ???

 

Theo mình hiểu thì bạn nhầm cái elist là một danh sách các mã dxf của các đối tượng được chọn trong hàm (setq elist (ssget '((0 . "*POLYLINE")))) .

Do vậy khi bạn dùng (setq ppl (nth i elist) ... ) là để lấy ra một danh sách các mã dxf của một đối tượng trong tập chọn đó. Và sau đó bạn dùng (car ppl) để lấy ra mã số của các mã dxf.

Điều này là không đúng như mình đã phân tích ở trên.

 

Tương tự như vậy bạn cũng bị sai ở các hàm (cdr(assoc k elist)) bạn ạ.

 

Bạn hãy đọc kỹ bài của bác Phamngoctukts hướng dẫn và làm lại xem 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

Vâng..Tối qua chỗ e mất mạng nên k biết các bác rl hướng dẫn.E sẽ nghiền ngẫm chỗ sai này ^^ ,mấy hnay bị ép hoàn thành công việc nên hơi bê trễ

Làm Kết Cấu khổ quá,suốt ngày bị giục tiến độ :( An toàn là trên hết,mà cứ giục,làm chẳng tính được,toàn bốc thuố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
Vâng..Tối qua chỗ e mất mạng nên k biết các bác rl hướng dẫn.E sẽ nghiền ngẫm chỗ sai này ^^ ,mấy hnay bị ép hoàn thành công việc nên hơi bê trễ

Làm Kết Cấu khổ quá,suốt ngày bị giục tiến độ :( An toàn là trên hết,mà cứ giục,làm chẳng tính được,toàn bốc thuốc ^^

Hề hề hề,

Bình tĩnh, bình tĩnh,

Bốc gì thì bốc chớ đừng bốc ...... phét mà ra thuốc bậy thì thành lang băm đó. Hề hề hề,....

Chả cứ gì Kết cấu mới khổ, Kết bè Kết đảng rồi cũng đua nhau "ủ tờ" cả đám đó thôi. Nhất là cái anh cu Kết duyên thì khổ cả đời đấy bác ạ.... 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

Mình dựa theo cái líp của bác tbinh viết thử cái líp sửa chiều cao của Text trong Dim, mà không đc, hjx.

Các bác xem giúp em vơi nhé:

 

(defun c:cdim (/ p1 p2 caodim ssd en tl el e)
(vl-load-com)
(command "undo" "be")
(setq tl (getreal "\nChon ty le <1/50>: "))
(if (not tl) (setq tl 50))
(setq   p1 (getpoint "\nChon diem dau: ")
  p2 (getpoint "\nChon diem cuoi: ")
  caodim (/ (distance p1 p2) tl)
  i 0)
(princ (strcat "\nChieu cao dim " (rtos caodim) ""));in caodim
(princ "\nChon DIM can fix: ")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq ssd (ssget '(0 . "DIMENSION"))); loc dim
(while (< i (sslength ssd))
(setq en (ssname ssd i));;lay ten
     ;el (entget en);;lay list thong tin
  ;e (cdr (assoc 3 el))
                (vlax-ename->vla-object en);;chuyen sang vla obj
                (vlax-put-property 'textheight caodim);; nhap caodim vao texthight
 (setq i (1+ i))	 
);endwhile			  
(command "regen")			  
(command "undo" "e")
(princ)
);end defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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 dựa theo cái líp của bác tbinh viết thử cái líp sửa chiều cao của Text trong Dim, mà không đc, hjx.

Các bác xem giúp em vơi nhé:

 

Thay đoạn này: (setq ssd (ssget '(0 . "DIMENSION"))); loc dim

bằng đoạn này: (setq ssd (ssget '((0 . "DIMENSION"))))

Thay đoạn này:

(while (< i (sslength ssd))

(setq en (ssname ssd i));;lay ten

;el (entget en);;lay list thong tin

;e (cdr (assoc 3 el))

(vlax-ename->vla-object en);;chuyen sang vla obj

(vlax-put-property 'textheight caodim);; nhap caodim vao texthight

(setq i (1+ i))

);endwhile

bằng đoạn này:

(while (< i (sslength ssd))

(setq en (ssname ssd i))

(vlax-put-property (vlax-ename->vla-object en) 'textheight caodim)

(setq i (1+ i))

) ;_ end while

  • 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
Mình dựa theo cái líp của bác tbinh viết thử cái líp sửa chiều cao của Text trong Dim, mà không đc, hjx.

Các bác xem giúp em vơi nhé:

 

(defun c:cdim (/ p1 p2 caodim ssd en tl el e)
(vl-load-com)
(command "undo" "be")
(setq tl (getreal "\nChon ty le <1/50>: "))
(if (not tl) (setq tl 50))
(setq   p1 (getpoint "\nChon diem dau: ")
  p2 (getpoint "\nChon diem cuoi: ")
  caodim (/ (distance p1 p2) tl)
  i 0)
(princ (strcat "\nChieu cao dim " (rtos caodim) ""));in caodim
(princ "\nChon DIM can fix: ")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq ssd (ssget '(0 . "DIMENSION"))); loc dim
(while (< i (sslength ssd))
(setq en (ssname ssd i));;lay ten
     ;el (entget en);;lay list thong tin
  ;e (cdr (assoc 3 el))
                (vlax-ename->vla-object en);;chuyen sang vla obj
                (vlax-put-property 'textheight caodim);; nhap caodim vao texthight
 (setq i (1+ i))	 
);endwhile			  
(command "regen")			  
(command "undo" "e")
(princ)
);end defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Code của bạn chỗ thì thừa chỗ thì thiếu. Mình đã sửa cho bạn rồi đấy. Bạn tự nghiên cứu xem mình sai chỗ nào nhé. Mình cũng toàn dùng cách này thì lần sau mới nhơ. Chúc bạn thành công.

;; free lisp from cadviet.com
(defun c:cdim (/ p1 p2 caodim ssd en tl el e)
(vl-load-com)
(command "undo" "be")
(setq caodim (getdist "\nNhap 2 diem hay cao chu: ")
i 0)
(princ (strcat "\nChieu cao dim " (rtos caodim) ""));in caodim
(princ "\nChon DIM can fix: ")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq ssd (ssget '((0 . "DIMENSION")))); loc dim
(while (< i (sslength ssd))
(setq en (ssname ssd i)
     el (vlax-ename->vla-object en)
)
(vlax-put-property el 'textheight caodim)
(setq i (1+ i))	 
);endwhile			  
(command "regen")			  
(command "undo" "e")
(princ)
);end defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  • 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

Thank 2 bác đã giúp e sửa cái líp trên. E muốn hỏi 1 câu nữa mong các bác giúp.

hàm (vlax-put-property obj property arg) thì tên các property của nó là gì?

em thử mấy cái tên lấy trong bảng properties bằng cách (ctrl+1) hoặc lệnh "mo" thì không được. tìm trong help cũng không thấy nó ghi ra.... Thnk

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
Thank 2 bác đã giúp e sửa cái líp trên. E muốn hỏi 1 câu nữa mong các bác giúp.

hàm (vlax-put-property obj property arg) thì tên các property của nó là gì?

em thử mấy cái tên lấy trong bảng properties bằng cách (ctrl+1) hoặc lệnh "mo" thì không được. tìm trong help cũng không thấy nó ghi ra.... Thnk

Diễn đàn đã đề cập rồi, bạn search chắc sẽ tìm thấy. Ssg nhắc lại lần nữa vậy.

Bạn dùng "chiêu" này:

 

(vlax-dump-object (vlax-ename->vla-object (car (entsel "\nChon doi tuong:"))))

 

Bấm F2 sẽ thấy properties và arguments của đối tượng bạn vừa select.

  • 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

Vẫn cái Líp trên của em. em thêm thắt vào 1 tý, nhưng báo lỗi. Ai sửa hộ em với. Học mất gốc khổ quá.Hix

Hình như hỏng chỗ em đánh dấu ý

 

(defun c:hcn (/ Rec pt1 pt2 pt3 pt4 toadodinh caodim tile i el1 el ssd en)
(vl-load-com)
(command "undo" "be")
(setq Rec (acet-ent-geomextents (car (entsel "Chon block khung ten:")))
pt1 (nth 0 Rec);lay dinh
pt2 (nth 1 Rec);lay dinh
i 0);setq
(command "RECTANG" pt1 pt2)
(setq el1 (entlast));el1
;;;;;;;;;;(acet-ent-geomextents:diem thap nhat trai va cao nhat phai, ve hcn;;;;;;;
;---------------------
;;;;;;;lay tile, mac dinh la :1/150	
(setq tile (getreal "\nChon ty le <1/150> :"))
(if (= tile nil) (setq tile 150));; mac dinh la 1/150
;---------------------
;;;;;;;;;lay dinh HCN = acet-geom-vertex-list
(setq toadodinh (acet-geom-vertex-list (car (entsel (el1))));;;;Bi Hong Cho Nay????
pt3 (nth 0 toadodinh);lay dinh
pt4 (nth 3 toadodinh);lay dinh
caodim (/ (distance pt3 pt4) tile));setq
;;;;;;IN pt3 pt4;;;;;;;;;;
(princ (strcat "\npt3: " (rtos pt3) " \npt4: " (rtos pt4)".\n Chon Dim: " ))
;---------------------
;;;;;;;;;;;main;;;;;;;;;;;;;;
(setq ssd (ssget '((0 . "DIMENSION")))); loc dim
(while (< i (sslength ssd))
(setq en (ssname ssd i);;lay so thu tu
     el (vlax-ename->vla-object en))
              (vlax-put-property el 'textheight caodim)
		   (setq i (1+ i))	 
);endwhile
        (command "ERASE" el1)	;xoa hcn		  
(command "undo" "e")
(princ "\n...Done... ")
(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
Vẫn cái Líp trên của em. em thêm thắt vào 1 tý, nhưng báo lỗi. Ai sửa hộ em với. Học mất gốc khổ quá.Hix

Hình như hỏng chỗ em đánh dấu ý

 

(defun c:hcn (/ Rec pt1 pt2 pt3 pt4 toadodinh caodim tile i el1 el ssd en)
(vl-load-com)
(command "undo" "be")
(setq Rec (acet-ent-geomextents (car (entsel "Chon block khung ten:")))
pt1 (nth 0 Rec);lay dinh
pt2 (nth 1 Rec);lay dinh
i 0);setq
(command "RECTANG" pt1 pt2)
(setq el1 (entlast));el1
;;;;;;;;;;(acet-ent-geomextents:diem thap nhat trai va cao nhat phai, ve hcn;;;;;;;
;---------------------
;;;;;;;lay tile, mac dinh la :1/150	
(setq tile (getreal "\nChon ty le <1/150> :"))
(if (= tile nil) (setq tile 150));; mac dinh la 1/150
;---------------------
;;;;;;;;;lay dinh HCN = acet-geom-vertex-list
(setq toadodinh (acet-geom-vertex-list (car (entsel (el1))));;;;Bi Hong Cho Nay????
pt3 (nth 0 toadodinh);lay dinh
pt4 (nth 3 toadodinh);lay dinh
caodim (/ (distance pt3 pt4) tile));setq
;;;;;;IN pt3 pt4;;;;;;;;;;
(princ (strcat "\npt3: " (rtos pt3) " \npt4: " (rtos pt4)".\n Chon Dim: " ))
;---------------------
;;;;;;;;;;;main;;;;;;;;;;;;;;
(setq ssd (ssget '((0 . "DIMENSION")))); loc dim
(while (< i (sslength ssd))
(setq en (ssname ssd i);;lay so thu tu
     el (vlax-ename->vla-object en))
              (vlax-put-property el 'textheight caodim)
		   (setq i (1+ i))	 
);endwhile
        (command "ERASE" el1)	;xoa hcn		  
(command "undo" "e")
(princ "\n...Done... ")
(princ)
)

Bạn sai 2 dòng này

(setq toadodinh (acet-geom-vertex-list (car (entsel (el1))));;;;Bi Hong Cho Nay????

sửa thành (setq toadodinh (acet-geom-vertex-list el1) Thằng el1 chính là ename của hcn rồi

và dòng này (princ (strcat "\npt3: " (rtos pt3) " \npt4: " (rtos pt4)".\n Chon Dim: " ))

pt3 pt4 là toạ độ điểm không thể chuyển sang dạng số được.

  • 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
Thank 2 bác đã giúp e sửa cái líp trên. E muốn hỏi 1 câu nữa mong các bác giúp.

hàm (vlax-put-property obj property arg) thì tên các property của nó là gì?

em thử mấy cái tên lấy trong bảng properties bằng cách (ctrl+1) hoặc lệnh "mo" thì không được. tìm trong help cũng không thấy nó ghi ra.... Thnk

Đó là bạn chưa tìm đúng chỗ thôi.

Trong Help, vào phần ActiveX and VBA Refrence sẽ có đủ

Bấm vào Object model, ta sẽ thấy 1 sơ đồ (Chart) các đối tượng của CAD.

Bấm vào đối tượng, ta sẽ thấy ngay 1 bảng Method, Properties của đối tượng đó.

Bấm vào Method, Properties, ta sẽ biết các Argument (và return val) của từng hàm

 

Để thực hiện method, dùng hàm

(vlax-invoke-method obj method arg [arg...])

 

Để lấy property dùng hàm

(vlax-get-property object property)

 

Nếu property không phải read only, ta có thể dùng hàm gán

(vlax-put-property obj property arg)

Bạn xem kỹ các VD trong Help là sử dụng dễ dàng

 

Vì các Argument thường dùng kiểu Variant nên

dùng các hàm vlax-make-variant, vlax-variant-value, vlax-variant-change-type để chuyển kiểu

  • 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

;;;;bat dau hoc
(defun c:anhp()
 (setq p1 (getpoint "\ndiem chuan"))
;;; doi mau
 (command "color" 1)
;;;;nhap khoang cach
 (setq x (getreal "\nchieu cao:"))
 (setq l (getreal "\nchieu dai theo truc x:"))
 (setq h (getreal "\nchieu cao cung:"))
 (setq o (getreal "\nkhoang cach:"))
 (setq p2 (polar p1 1.5707 x))
 (setq d1 (command "line" p1 p2 ""))
 (setq p3 (polar p2 0.0 l))
 (command "line" p2 p3 "")
 (setq p4 (polar p3 -1.5707 x))
(setq d2 (command "line" p3 p4 ""))
;;;;ket thuc mot cai
 (setq p5 (polar p2 0.0 (/ l 2)))
 (setq p6 (polar p5 1.5707 h))
 (command "line" p5 p6 "")
;;;; ve arc
 (setq arc1 (command "arc" p3 p6 p2 ""))
;;;; offset
(command "offset" o
 	(setq arc2 (entsel "chon doi tuong:"))
		'(-1.5707 -60) "e")
 (command "zoom" "all")
 (command "fillet" "r" 0 "")
 (setq a1 (entsel "chon doi tuong 1:"))
 (setq a2 (entsel "chon doi tuong 2:"))
 (setq a3 (entsel "chon doi tuong 3:"))
 (setq a4 (entsel "chon doi tuong 4:"))
(command "fillet" a1 a2 "")
 (command "fillet" a3 a4 "")
  (setq a5 (entsel "xoa doituong:"))
 (setq a6 (entsel "xoa doi tuong 6:"))
 (command "erase" a5 a6 "")
 (setq a5 (entsel "chon doi tuong 5:"))
 (setq a6 (entsel "chon doi tuong 6:"))
 (setq a7 (entsel "chon doi tuong 7:"))
 (setq a8 (entsel "chon doi tuong 8:"))
(command "region" a5 a6 a7 a8 "")
  (setq a9 (entsel "chon doi tuong 9:"))
 (setq h1 (getreal "\nchieu cao doi tuong:"))
 (command "extrude" a9 "" h1)
	(princ)
 )

Mình muốn vẽ một biên dang cung : khi cho chiều dài và độ cao của cung. Sau do minh se extrude len 3d thanh nan ghế. Nhung do lisp cua mình còn thủ công quá. Nên mình mới nhờ các huynh xem co cách lam nao nhanh hơn không. Chờ phản hồi từ các huynh.....

2.jpg1.jpg

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 muốn vẽ một biên dang cung : khi cho chiều dài và độ cao của cung. Sau do minh se extrude len 3d thanh nan ghế. Nhung do lisp cua mình còn thủ công quá. Nên mình mới nhờ các huynh xem co cách lam nao nhanh hơn không. Chờ phản hồi từ các huynh.....

2.jpg1.jpg

Hề hề hề,

Bạn mới học mà làm cái lisp khủng ra phết nhể.

Xin góp ý mấy điều thiển nghĩ như sau:

1/- Các line chẳng dùng để làm gì thì bạn mất công vẽ ra chi cho nó thêm Khủng vậy???

2/- Giá trị 1.5707.... bạn nên cứ để là (/ pi 2) sẽ tốt hơn vì nó sẽ chính xác hơn là lấy giá trị gần đúng.

3/- Cái ni (command "offset" o

(setq arc2 (entsel "chon doi tuong:"))

'(-1.5707 -60) "e")

bạn dùng để offset cái cung arc1 về một phía đúng không???

Vậy thì đặt thêm biến arc2 làm chi cho nó thêm hoảng .... vía vậy.

Bạn thử thay thế này xem nó có ra cái bạn cần không nhé:

 

(command "offset" o arc1 '(-1.5707 -60) "")

Chú ý là dấu "" cũng sẽ tương đương với "e" của bạn rùi.

4/- Tương tự vậy với các đối tượng của lệnh fillet.

Thay vì bạn viết (command "fillet" a1 a2 "") với một lô định nghĩa (setq a1 .....)

Bạn có thể viết ngắn hơn như sau

(command "fillet" (entsel "/n Chon đoi tuong 1") (entsel '/n Chon đoi tuong 2") "")

5/- Với lệnh erase bạn có thể sử dụng đối tượng là bộ chọn nên bạn có thể viết đơn giản là:

(command "erase" (ssget) "") và sau đó tha hồ mà pick trên bản vẽ những chú nào ngứa mắt rồi enter là OK

6/- Với lệnh region, đơn giản hơn là bạn nên dùng pedit để nối các biên thành một polyline kín với câu lệnh:

(command "pedit" arc1 "y" "j" (ssget) "")

7/- Sau lệnh Region (hoặc pedit) bạn chỉ cần (setq a9 (entlast)) là có ngay thằng cu profile để extrude rùi mà khỏi phải pick enetsel nữa.

 

Hề hề hề,

Lisp nào thì cũng thủ công cả mà thôi, chẳng qua là máy nó thủ nhanh hơn mình tí tẹo ấy mà. Chớ có tự khiêm mà hạn chế cái tài năng của mình bạn nhé. Mong rằng bạn sẽ trở thành chỗ dựa cho mọi người trên diễn đàn.

Hề hề hề.....

Mà bài toán của bạn nên nói đúng hơn là vẽ một cung khi biết chiều dài DÂY TRƯƠNG CUNG và chiều cao CUNG ( chớ không phải chiều dài của cung bạn ạ)

Hề hề hề,...

  • 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

Trước hết xin cam on huynh: Bình. Ban that tuyệt vì da jup minh hieu them ve co ban cua lisp. Nhung dieu chinh sua cua ban giup minh ngộ ra nhieu dieu. Thanks ban va mong su chi giao nhieu tu phia ban. Hien tai minh dang viet lisp xuất sản phẩm từ 3d thanh 2d. Đỡ mat cong ton suc fai qua lai giua layout va model. Heee mong su chi giao cua ban.

 

Đồng thời cam on su nhac nho cua ketxu.

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 cảm ơn làm gì nê

Trước hết xin cam on huynh: Bình. Ban that tuyệt vì da jup minh hieu them ve co ban cua lisp. Nhung dieu chinh sua cua ban giup minh ngộ ra nhieu dieu. Thanks ban va mong su chi giao nhieu tu phia ban. Hien tai minh dang viet lisp xuất sản phẩm từ 3d thanh 2d. Đỡ mat cong ton suc fai qua lai giua layout va model. Heee mong su chi giao cua ban.

 

Đồng thời cam on su nhac nho cua ketxu.

- Bạn cảm ơn bác Binh sao không nhấn Like ?

- Bạn cảm ơn mình sao không gõ TV có dấu ?

  • 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

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

×