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ị

Tue_NV ah. Mình đã cất công tìm cả 38 trang lisp theo yêu cầu mà vẫn ko thấy lisp đánh số thứ tự như yêu cầu của mình nhỉ. Tue_NV hay anh em nào đang có sẵn, vui lòng upload lại giúp mình đc không?

Xin chân thành 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
Cảm ơn tomboy rất rất nhiều lắm. Nhưng Tue_NV vẫn thấy cái Lisp trên nó vẽ đa giác lồi chứ chưa vẽ ra được đa giác lõm Tomboy à.

 

Đây là file .dwg thể hiện đa giác lõm cần vẽ

http://www.cadviet.com/upfiles/2/dagiaclom.dwg

 

Tiện thể Tomboy có thể nâng cấp lên trong trường hợp đối tượng là point nữa được không? Vì đôi lúc mọi người cần vẽ đối tượng là Point hơn là điểm chèn của Text. Tue_NV tham quá :cheers:

Cảm ơn tomboy nhiều.

 

@truongthanh : Trường hợp mà Text lọt ra ngoài Pline như trường hợp anh gia_bach nói là trường hợp mà hệ số tỉ lệ < 1 và điểm chèn (Insert) của Text nằm khá xa so với tâm Centroid

ok Tomboy đã sửa lại theo yc của bạn nè, nhưng chỉ đạt 70% yc thôi nhé, tại vì tập hợp các điểm lại là những điểm đo ngẫu nhiên ở ngoài thực địa và những điểm này lại là điểm ranh đất hay ranh gì đó có đường biên bao kín bên ngoài không tuân theo quy luật nào hết, do vậy để đảm bảo chính xác thì mật độ điểm đo phải dầy, khoảng cách giữa các điểm phải tương đối đều nhau và tỉ số cạnh phải nhỏ, tối thiểu phải nhỏ hơn 1.4, thường mình đặt 1.1 là hợp lý. đây là link: http://www.cadviet.com/upfiles/2/dgl_3.lsp

(bản vá lỗi)

bản này đạt 100% rùi. http://www.cadviet.com/upfiles/2/dgl_5.lsp

  • 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
Tue_NV ah. Mình đã cất công tìm cả 38 trang lisp theo yêu cầu mà vẫn ko thấy lisp đánh số thứ tự như yêu cầu của mình nhỉ. Tue_NV hay anh em nào đang có sẵn, vui lòng upload lại giúp mình đc không?

Xin chân thành cảm ơn!

Link nè bạn: http://www.cadviet.com/upfiles/2/cps_1.lsp

lệnh là CPS

bạn sử dụng như lệnh copy bình thường, nhưng bạn muốn đánh số trang thì bạn hãy đánh 1 trang trước nhé rồi copy nó ra, khi copy nó sẽ tự động nhảy trang cho bạn

ví dụ bạn muốn đánh số trang từ 21 trở đi thì bạn dùng lện text của acad để tạo một chữ số 21 hay là Page 21 gì tuỳ ý. sau đó bạn sử dụng lệnh CPS để copy chữ này vào từng trang bản vẽ của bạn:

Command: cps

Select objects: 1 found

Specify base point or [Prefix/Suffix/Off] : P là tiền tố, S là hậu tố, Of là tắt luôn,

Specify second point of displacement or :

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

Tomboy oi, kô dùng được, mình gõ lệnh mà nó không thao tác j cả, chán thật, bạn kiểm tra lại júp mình xem nhé, cảm ơn nhìu nhì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
Tomboy oi, kô dùng được, mình gõ lệnh mà nó không thao tác j cả, chán thật, bạn kiểm tra lại júp mình xem nhé, cảm ơn nhìu nhìu

mình vẫn dùng nó để đánh trang cho bản vẽ mà, bạn phải apload thì mới được chứ

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ó thể cho em xin lisp về ranh giới đào đắp trong san nền với. em khong tìm thấy đâu ra hết. cụ thể là có cao độ ở bốn góc của rất nhiều hình vuông( cả âm và dương), bây giớ phải tìm cao độ 0 rồi nối các điêm có tọa độ 0 lại. cảm ơn mấy bác 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
Xin nhờ các bạn chỉnh giúp mình lisp sau:

Minh đang viết một lisp để lấy các giá trị TAG của ATT trong block.

Nội dung:

Nhưng khi chạy thì em thấy có gì đó không ổn. Vậy nhờ các bạn chỉnh lại giúp mình !

Chào bạn aliosa,

Cái lisp của bạn mình chưa hiểu hết nên không dám chỉnh sửa gì cả. Bạn thử xài cái lisp này xem có thỏa mãn yêu cầu của bạn không nhé. Nếu có gì chưa ổn hãy post lên diễn đàn và mọi người sẽ xem và sửa chữa lại bạn nhé.

http://www.cadviet.com/upfiles/2/laythuoctinhblock.lsp

(defun c:gtb ()
(if (setq ent(entsel "\n Select a Block: ")) ;- Let the user select a block (Chọn block)
(progn                                                    
 (setq en(car ent))               ;- Get the entity name of the block (lấy tên đối tượng của block)
 (setq enlist(entget en))             ;- Get the DXF group codes (lấy các mã nhóm DXF)
 (setq blkType(cdr(assoc 0 enlist)))      ;- Save the type of entity (lưu lại loại đối tượng)
 (if (= blkType "INSERT")              ;- If the entity type is an Insert entity 
                                                  ; (nếu loại đối tượng là đối tượng Insert)
  (progn
   (if(= (cdr(assoc 66 enlist)) 1)    ;- See if the attribute flag equals one (if so, attributes follow)  
                                                 ; (Kiểm tra flag thuộc tính )
   (progn
     (setq en2(entnext en))                ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
     (setq enlist2(entget en2))       ;- Get the DXF group codes (lấy các mã nhóm DXF)
     (setq attvallst (list))
     (setq atttaglst (list))

     (while (/= (cdr(assoc 0 enlist2)) "SEQEND")  ;- Start the while loop and keep  
                                                   ;-  looping until SEQEND is found.
                                                   ;(Lặp trong khi loại đối tượng không phải SEQEND)
       (setq attval (cdr (assoc 1 enlist2))  
             attvallst (append attvallst (list attval)))
       (setq atttag (cdr (assoc 2 enlist2))
             atttaglst (append atttaglst (list atttag)))              
       (princ "\n ")                      ;-Print a new line (tạo dòng kết quả mới)
       (princ attvallst)                   ;- Print the attribute DXF group codes (in ra các mã nhóm DXF)
       (princ "\n")
       (princ atttaglst)
       (setq en2(entnext en2))    ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
       (setq enlist2(entget en2))     ;- Get the DXF group codes (lấy các mã nhóm DXF)
     ) ; Kết thúc hàm while
    )  ; Kết thúc hàm thông báo progn lần thứ 3
   )  ;- Close the if group code 66 = 1 statement  (Đóng hàm if  kiểm tra mã nhóm 66 )
  ) ; Kết thúc hàm thông báo progn lần thứ 2
 )   ;- Close the if block type = "ATTRIB" statement (Đóng hàm if kiểm tra loại đối tượng)
)  ; Đóng thông báo progn lần thứ nhất
)   ;- Close the if an Entity is selected statement  (Đóng hàm if kiểm tra việc chọn đối tượng)
)

Chúc bạn 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
Mình có 1 lisp hay về cầu đường đã tổng hợp nhiều lisp nhỏ bên trong.

Nội dung một số đoạn mình cần các bạn hoàn chình là:

Lisp có lệnh là MN (vẽ mực nước), VC (vết cắt) và 1 số lệnh nữa khi thực hiện lệnh cho tới lúc vẽ xong thì nó làm cho chế độ Obsnap Setting ko chạy được nữa. Tức là mất chế độ bắt điểm sau khi thực hiện lệnh đó. Ai biết chỉ dùm mình được ko

Thanks!

http://www.cadviet.com/upfiles/2/cuong.lsp

Ôi các bác ơi giúp em cái vụ này với chờ mãi chẳng có ai vậy trờ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
Chào bạn aliosa,

Cái lisp của bạn mình chưa hiểu hết nên không dám chỉnh sửa gì cả. Bạn thử xài cái lisp này xem có thỏa mãn yêu cầu của bạn không nhé. Nếu có gì chưa ổn hãy post lên diễn đàn và mọi người sẽ xem và sửa chữa lại bạn nhé.

http://www.cadviet.com/upfiles/2/laythuoctinhblock.lsp

(defun c:gtb ()
(if (setq ent(entsel "\n Select a Block: ")) ;- Let the user select a block (Chọn block)
(progn                                                    
 (setq en(car ent))               ;- Get the entity name of the block (lấy tên đối tượng của block)
 (setq enlist(entget en))             ;- Get the DXF group codes (lấy các mã nhóm DXF)
 (setq blkType(cdr(assoc 0 enlist)))      ;- Save the type of entity (lưu lại loại đối tượng)
 (if (= blkType "INSERT")              ;- If the entity type is an Insert entity 
                                                  ; (nếu loại đối tượng là đối tượng Insert)
  (progn
   (if(= (cdr(assoc 66 enlist)) 1)    ;- See if the attribute flag equals one (if so, attributes follow)  
                                                 ; (Kiểm tra flag thuộc tính )
   (progn
     (setq en2(entnext en))                ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
     (setq enlist2(entget en2))       ;- Get the DXF group codes (lấy các mã nhóm DXF)
     (setq attvallst (list))
     (setq atttaglst (list))

     (while (/= (cdr(assoc 0 enlist2)) "SEQEND")  ;- Start the while loop and keep  
                                                   ;-  looping until SEQEND is found.
                                                   ;(Lặp trong khi loại đối tượng không phải SEQEND)
       (setq attval (cdr (assoc 1 enlist2))  
             attvallst (append attvallst (list attval)))
       (setq atttag (cdr (assoc 2 enlist2))
             atttaglst (append atttaglst (list atttag)))              
       (princ "\n ")                      ;-Print a new line (tạo dòng kết quả mới)
       (princ attvallst)                   ;- Print the attribute DXF group codes (in ra các mã nhóm DXF)
       (princ "\n")
       (princ atttaglst)
       (setq en2(entnext en2))    ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
       (setq enlist2(entget en2))     ;- Get the DXF group codes (lấy các mã nhóm DXF)
     ) ; Kết thúc hàm while
    )  ; Kết thúc hàm thông báo progn lần thứ 3
   )  ;- Close the if group code 66 = 1 statement  (Đóng hàm if  kiểm tra mã nhóm 66 )
  ) ; Kết thúc hàm thông báo progn lần thứ 2
 )   ;- Close the if block type = "ATTRIB" statement (Đóng hàm if kiểm tra loại đối tượng)
)  ; Đóng thông báo progn lần thứ nhất
)   ;- Close the if an Entity is selected statement  (Đóng hàm if kiểm tra việc chọn đối tượng)
)

Chúc bạn vui.

Xin cảm ơn bạn ! Lisp chạy rất tốt. Bạn có thể bổ sung giúp mình trả về kết quả ở dạng danh sách với cấu trúc ((TAG_NAME1 . VAL_TAG1) (TAG_NAME2 . VAL_TAG2)...) để giúp cho quá trình xử lý tiếp sau được thuận lợi hơn.

Xin chân thành cảm ơ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
Xin cảm ơn bạn ! Lisp chạy rất tốt. Bạn có thể bổ sung giúp mình trả về kết quả ở dạng danh sách với cấu trúc ((TAG_NAME1 . VAL_TAG1) (TAG_NAME2 . VAL_TAG2)...) để giúp cho quá trình xử lý tiếp sau được thuận lợi hơn.

Xin chân thành cảm ơn !!!

Bạn xem đoạn lisp sau đây, mình đã bổ sung theo yêu cầu của bạn. Không biết đã đúng chưa, bạn chạy thử nhé.

(defun c:gtb ()
(if (setq ent(entsel "\n Select a Block: ")) ;- Let the user select a block (Chọn block)
(progn                                                    
 (setq en(car ent))        ;- Get the entity name of the block (lấy tên đối tượng của block)
 (setq enlist(entget en))             ;- Get the DXF group codes (lấy các mã nhóm DXF)
 (setq blkType(cdr(assoc 0 enlist)))      ;- Save the type of entity (lưu lại loại đối tượng)
 (if (= blkType "INSERT")              ;- If the entity type is an Insert entity 
                                       ;(nếu loại đối tượng là đối tượng Insert)
  (progn
   (if(= (cdr(assoc 66 enlist)) 1)    ;- See if the attribute flag equals one (if so, attributes follow)  
                                      ;(Kiểm tra flag thuộc tính )
   (progn
     (setq en2(entnext en))                ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
     (setq enlist2(entget en2))       ;- Get the DXF group codes (lấy các mã nhóm DXF)
     (setq attvallst (list))
     (setq atttaglst (list))
     (setq attlst (list))
     (while (/= (cdr(assoc 0 enlist2)) "SEQEND")  ;- Start the while loop and keep 
                              ;-  looping until SEQEND is found. 
                              ;(Lặp trong khi loại đối tượng không phải SEQEND)
       (setq attval (cdr (assoc 1 enlist2))  
             attvallst (append attvallst (list attval)))
       (setq atttag (cdr (assoc 2 enlist2))
             atttaglst (append atttaglst (list atttag)))
       (setq att (cons atttag attval)
             attlst (append attlst (list att)))              
       (princ "\n ")                      ;-Print a new line (tạo dòng kết quả mới)
       (princ attvallst)      ;- Print the attribute value (in ra các gia trị thuộc tính)
       (princ "\n")
       (princ atttaglst)
       (princ "/n")
       (princ attlst)
       (setq en2(entnext en2))    ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
       (setq enlist2(entget en2))     ;- Get the DXF group codes (lấy các mã nhóm DXF)
     ) ; Kết thúc hàm while
    )  ; Kết thúc hàm thông báo progn lần thứ 3
   )  ;- Close the if group code 66 = 1 statement  (Đóng hàm if  kiểm tra mã nhóm 66 )
  ) ; Kết thúc hàm thông báo progn lần thứ 2
 )   ;- Close the if block type = "ATTRIB" statement (Đóng hàm if kiểm tra loại đối tượng)
)  ; Đóng thông báo progn lần thứ nhất
)   ;- Close the if an Entity is selected statement  (Đóng hàm if kiểm tra việc chọn đối tượng)
)

Có thể kết quả in ra là thừa so với yêu cầu của bạn, nếu vậy những cái thừa bạn có thể lược bớt nhé. Chỉ cần xóa dòng code (princ "các kết quả thừa đi") bạn ạ

Ví dụ bạn muốn bỏ cái list của các giá trị thuộc tính thì bạn xóa dòng code (princ attvallst).

Trong đoạn lisp trên thực ra bạn có thể đưa các lệnh in kết quả ra sau vòng lặp while vì có thể chả cần in chúng ra giữa chừng khi chưa chạy xong làm chi. Tuy nhiên nếu để như vậy thì khi bạn chạy debug sẽ dễ phát hiện lỗi hơn.

Lisp này là mình mót được của cụ Jeffy Sanders rồi sửa lại tí chút thôi mà.

Chúc bạn 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

MÌNH CÓ Ý TƯỞNG THẾ NÀY

CÔNG VIỆC : TÍNH KHỐI LƯỢNG ĐÀO ĐẮP

BẢN EXCEL NHƯ SAU

LYTRINH KCACH S ĐÀO S ĐẮP V ĐÀO V ĐẮP

LẤY TỪ NTD LẤY TỪ NTD

 

PHẦN S ĐÀO TA DÙNG LỆNH Q CHỌN VÙNG POLYLINE KÍN TRONG CAD THEO THỨ TỰ CỦA LÝ TRÌNH TRONG TRẮC NGANG NOVA.THONG TIN S ĐÀO XUẤT RA EXECL HAY TXT THEO THỨ TỰ NHƯ SAU

TT DT

1 KQDT

2 KQDT

3 KQDT

...

SAU ĐÓ TA GHÉP HAI BẢNG EXCEL LẠI LÀ CÓ ĐƯỢC V ĐÀO

 

KHÔNG BIẾT CÁC BẠN GIÚP ĐƯỢC MÌNH KHÔNG ,CHỨ MÌNH NGỒI NHẬP TỪ CỌC TRẮC NGANG 1 TỪ CAD QUA BẢN EXCEL LÂU QUÁ

http://www.cadviet.com/upfiles/2/b1.jpg

MÌNH CÓ PHẦN AUTOLIT TÍNH DT NHƯNG KHỐNG BIẾT LÀM PHẦN XUẤT SANG ỄXCEL HAY TXT

 

(defun C:Q()

(initget 1 "1 2 3")

(Setq kieu (getkword "\nChon : <1>§µo CG <2>§¾p CG <3>Phong ho¸ : "))

 

(setq OLD_OSMODE (getvar "OSMODE"))

(setvar "OSMODE" 0) ; Tat che do Osnap tu dong

 

(setq DTich 0.000)

 

(while (setq P1 (getpoint "\nChon diem trong vung tinh dien tich : "))

(command "Bpoly" P1 "") ; Tao bien tinh S

(command "area" "o" "l") ; Tinh S theo bien da tao

(setq S (getvar "area")) ; Ghi nho gia tri S

(setq DTich (+ DTich S))

)

 

(setvar "OSMODE" OLD_OSMODE) ; Hoan tra che do Osnap tu dong

 

(setq P0 (getpoint "\nDiem ghi dien tich : "))

 

(Cond ((= kieu "1") (setq TXT (strcat "S®µo = " (rtos DTich 2 3) "m2")))

((= kieu "2") (setq TXT (strcat "S®¾p = " (rtos DTich 2 3) "m2")))

((= kieu "3") (setq TXT (strcat "Sph = " (rtos DTich 2 3) "m2")))

)

 

(setq STYLE_NAME (getvar "TEXTSTYLE"))

 

(setq STYLE_LIST (tblsearch "STYLE" STYLE_NAME))

(setq TEXT_HEIGHT (cdr (assoc 40 STYLE_LIST)))

(if (= TEXT_HEIGHT 0.0)

(setq H (getreal "\nChieu cao chu : "))

)

 

(if (/= TEXT_HEIGHT 0.0)

(command "TEXT" P0 0 TXT)

(command "TEXT" P0 H 0 TXT)

)

(prompt "\nProgram complete.")

(princ)

)

 

 

(defun C:QQ()

(initget 1 "1 2 3")

(Setq kieu (getkword "\nChon : <1>§µo TC <2>§¾p TC <3>Phong ho¸ : "))

 

(setq OLD_OSMODE (getvar "OSMODE"))

(setvar "OSMODE" 0) ; Tat che do Osnap tu dong

 

(setq DTich 0.000)

 

(while (setq P1 (getpoint "\nChon diem trong vung tinh dien tich : "))

(command "Bpoly" P1 "") ; Tao bien tinh S

(command "area" "o" "l") ; Tinh S theo bien da tao

(setq S (getvar "area")) ; Ghi nho gia tri S

(setq DTich (+ DTich S))

)

 

(setvar "OSMODE" OLD_OSMODE) ; Hoan tra che do Osnap tu dong

 

(setq P0 (getpoint "\nDiem ghi dien tich : "))

 

(Cond ((= kieu "1") (setq TXT (strcat "S®µo = " (rtos DTich 2 3) "m2")))

((= kieu "2") (setq TXT (strcat "S®¾p = " (rtos DTich 2 3) "m2")))

((= kieu "3") (setq TXT (strcat "Sph = " (rtos DTich 2 3) "m2")))

)

 

(setq STYLE_NAME (getvar "TEXTSTYLE"))

 

(setq STYLE_LIST (tblsearch "STYLE" STYLE_NAME))

(setq TEXT_HEIGHT (cdr (assoc 40 STYLE_LIST)))

(if (= TEXT_HEIGHT 0.0)

(setq H (getreal "\nChieu cao chu : "))

)

 

(if (/= TEXT_HEIGHT 0.0)

(command "TEXT" P0 0 TXT)

(command "TEXT" P0 H 0 TXT)

)

(prompt "\nProgram complete.")

(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
Ôi các bác ơi giúp em cái vụ này với chờ mãi chẳng có ai vậy trời

Chào bạn desperado,

Thực ra mình đã đọc yêu cầu của bạn, định trả lời rồi nhưng sợ phạm húy nên lại thôi.

Cái lisp bạn post lên khá là dài và người viết đã bỏ công phu rất nhiều. Trong đoạn lisp này đã có các lệnh để đảm bảo cho bạn không bị mất chế độ truy bắt điểm như các lệnh batsnap, tatsnap, trasnap.

Tuy nhiên có thể do bạn không đọc kỹ nó nên chưa biết cách dùng nó mà thôi.

Còn người viết lisp có thể do họ đã biết có các lệnh này nên trong quá trình viết các lệnh đơn như vẽ mực nước mà bạn đã nêu, họ đặt béng chế độ bắt điểm là none ((command "osnap" "none"), vì vậy khi bạn chạy một mình nó, đương nhiên là mất chế độ bắt điểm.

Nếu bạn muốn chỉ chạy lệnh đơn này mà vẫn giữ nguyên chế độ bắt điểm thì đơn giản là bạn phải thêm vào phía trước dòng code nói trên một đoạn code để lưu chế độ bắt điểm hiện hành của bạn (setq oldos (getvar "osmode")), đồng thời thêm vào cuối lệnh này trước dấu ngoặc kết thúc lệnh một dòng code để khôi phục chế độ bắt điểm (setvar "osmode" oldos).

Với các lệnh khác bạn cũng làm tương tự là mình tin sẽ không bị mất chế độ bắt điểm nữa bạn ạ. Hãy thử xem nhé

Chúc bạn vui và thành công trong cuộc sống.

  • 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
Đâ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.

cho minh xin lisp ghi cốt bản vẽ, bằng cách kick điểm.

ví dụ: bản vẽ theo tỉ lệ 1:1.

chọn cốt 0.000(kick diem)

sau đó muốn ghi cot diem nao thi chon diem do

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
Chào bạn desperado,

Thực ra mình đã đọc yêu cầu của bạn, định trả lời rồi nhưng sợ phạm húy nên lại thôi.

Cái lisp bạn post lên khá là dài và người viết đã bỏ công phu rất nhiều. Trong đoạn lisp này đã có các lệnh để đảm bảo cho bạn không bị mất chế độ truy bắt điểm như các lệnh batsnap, tatsnap, trasnap.

Tuy nhiên có thể do bạn không đọc kỹ nó nên chưa biết cách dùng nó mà thôi.

Còn người viết lisp có thể do họ đã biết có các lệnh này nên trong quá trình viết các lệnh đơn như vẽ mực nước mà bạn đã nêu, họ đặt béng chế độ bắt điểm là none ((command "osnap" "none"), vì vậy khi bạn chạy một mình nó, đương nhiên là mất chế độ bắt điểm.

Nếu bạn muốn chỉ chạy lệnh đơn này mà vẫn giữ nguyên chế độ bắt điểm thì đơn giản là bạn phải thêm vào phía trước dòng code nói trên một đoạn code để lưu chế độ bắt điểm hiện hành của bạn (setq oldos (getvar "osmode")), đồng thời thêm vào cuối lệnh này trước dấu ngoặc kết thúc lệnh một dòng code để khôi phục chế độ bắt điểm (setvar "osmode" oldos).

Với các lệnh khác bạn cũng làm tương tự là mình tin sẽ không bị mất chế độ bắt điểm nữa bạn ạ. Hãy thử xem nhé

Chúc bạn vui và thành công trong cuộc sống.

Cảm ơn bạn phamthanhbinh rất nhiều, ý bạn phạm huý là làm sao? Mình là người tổng hợp lại những cái cần dùng lại thành 1 file thôi mà chứ không phải là lấy của 1 người đâu. Mình đã thử nghiệm thành công.

Mình có thể bỏ chế độ này bằng xoá dòng ((command "osnap" "none") này đi có được không , hình như dòng này cần thiết cho lệnh này bạn ạ, mình cũng ko hiểu tại sao khi xoá thì lệnh bị lồ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
Cảm ơn bạn phamthanhbinh rất nhiều, ý bạn phạm huý là làm sao? Mình là người tổng hợp lại những cái cần dùng lại thành 1 file thôi mà chứ không phải là lấy của 1 người đâu. Mình đã thử nghiệm thành công.

Mình có thể bỏ chế độ này bằng xoá dòng ((command "osnap" "none") này đi có được không , hình như dòng này cần thiết cho lệnh này bạn ạ, mình cũng ko hiểu tại sao khi xoá thì lệnh bị lồi

Hề hề hề,

Mình nói phạm huý ấy là mình sợ nói không trúng ý của người viết lisp, có thể họ có lý do nhất định khi họ viết như vậy.

Còn việc bạn bỏ dòng lệnh (command "osnap" "none" ) đi là không nên đâu vì chế độ osnap (truy bắt điểm) sẽ cho phép bạn click vào 1 điểm gần với điểm cần truy bắt chứ không nhất thiết phải chính xác vào điểm đó. Vì vậy lisp sẽ chạy sai nếu như bạn click chọn điểm ở gần với một điểm nằm trong chế độ truy bắt nghĩa là lisp sẽ lấy kết quả là điểm truy bắt chứ không phải lấy kết quả là chính cái điểm bạn chọn.

Do vậy hầu hết trong các trường hợp sử dụng lisp, mọi người đều cố gắng tắt chế độ truy bắt này để lisp chạy được chính xác với yêu cầu của người dùng.

Rất mừng là bạn đã hiểu được vấn đề và thử nghiệm thành công. Hãy cố gắng dần dần bạn sẽ nắm vững các kiến thức cơ bản về lisp và có thể chủ động được trong công việc của bạn.

Chúc bạn vui.

Hề hề 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 xem đoạn lisp sau đây, mình đã bổ sung theo yêu cầu của bạn. Không biết đã đúng chưa, bạn chạy thử nhé.

(defun c:gtb ()
(if (setq ent(entsel "\n Select a Block: ")) ;- Let the user select a block (Chọn block)
(progn                                                    
 (setq en(car ent))        ;- Get the entity name of the block (lấy tên đối tượng của block)
 (setq enlist(entget en))             ;- Get the DXF group codes (lấy các mã nhóm DXF)
 (setq blkType(cdr(assoc 0 enlist)))      ;- Save the type of entity (lưu lại loại đối tượng)
 (if (= blkType "INSERT")              ;- If the entity type is an Insert entity 
                                       ;(nếu loại đối tượng là đối tượng Insert)
  (progn
   (if(= (cdr(assoc 66 enlist)) 1)    ;- See if the attribute flag equals one (if so, attributes follow)  
                                      ;(Kiểm tra flag thuộc tính )
   (progn
     (setq en2(entnext en))                ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
     (setq enlist2(entget en2))       ;- Get the DXF group codes (lấy các mã nhóm DXF)
     (setq attvallst (list))
     (setq atttaglst (list))
     (setq attlst (list))
     (while (/= (cdr(assoc 0 enlist2)) "SEQEND")  ;- Start the while loop and keep 
                              ;-  looping until SEQEND is found. 
                              ;(Lặp trong khi loại đối tượng không phải SEQEND)
       (setq attval (cdr (assoc 1 enlist2))  
             attvallst (append attvallst (list attval)))
       (setq atttag (cdr (assoc 2 enlist2))
             atttaglst (append atttaglst (list atttag)))
       (setq att (cons atttag attval)
             attlst (append attlst (list att)))              
       (princ "\n ")                      ;-Print a new line (tạo dòng kết quả mới)
       (princ attvallst)      ;- Print the attribute value (in ra các gia trị thuộc tính)
       (princ "\n")
       (princ atttaglst)
       (princ "/n")
       (princ attlst)
       (setq en2(entnext en2))    ;- Get the next sub-entity (lấy đối tượng phụ tiếp theo)
       (setq enlist2(entget en2))     ;- Get the DXF group codes (lấy các mã nhóm DXF)
     ) ; Kết thúc hàm while
    )  ; Kết thúc hàm thông báo progn lần thứ 3
   )  ;- Close the if group code 66 = 1 statement  (Đóng hàm if  kiểm tra mã nhóm 66 )
  ) ; Kết thúc hàm thông báo progn lần thứ 2
 )   ;- Close the if block type = "ATTRIB" statement (Đóng hàm if kiểm tra loại đối tượng)
)  ; Đóng thông báo progn lần thứ nhất
)   ;- Close the if an Entity is selected statement  (Đóng hàm if kiểm tra việc chọn đối tượng)
)

Có thể kết quả in ra là thừa so với yêu cầu của bạn, nếu vậy những cái thừa bạn có thể lược bớt nhé. Chỉ cần xóa dòng code (princ "các kết quả thừa đi") bạn ạ

Ví dụ bạn muốn bỏ cái list của các giá trị thuộc tính thì bạn xóa dòng code (princ attvallst).

Trong đoạn lisp trên thực ra bạn có thể đưa các lệnh in kết quả ra sau vòng lặp while vì có thể chả cần in chúng ra giữa chừng khi chưa chạy xong làm chi. Tuy nhiên nếu để như vậy thì khi bạn chạy debug sẽ dễ phát hiện lỗi hơn.

Lisp này là mình mót được của cụ Jeffy Sanders rồi sửa lại tí chút thôi mà.

Chúc bạn vui.

Mình cảm ơn bạn nhiều! Mình biết lisp cũng không qua trường lớp nào cả chỉ bản thân tự học bạn bè, sách vở thôi. Bạn viết như vậy là cẩn thận và dễ hiểu. Minh chạy chương trình là hiểu ý của dòng lệnh. Một lần nữu cảm ơn các bạ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
Mình cảm ơn bạn nhiều! Mình biết lisp cũng không qua trường lớp nào cả chỉ bản thân tự học bạn bè, sách vở thôi. Bạn viết như vậy là cẩn thận và dễ hiểu. Minh chạy chương trình là hiểu ý của dòng lệnh. Một lần nữu cảm ơn các bạn !!!

Hề hề hề,

Nếu bạn chịu khó xem hết cái topic về autolíp này cũng sẽ vỡ ra được khối thứ đấy bạn ạ. Khi đó chắc bạn sẽ biết tỏng tòng tong rằng mình cũng chỉ là thằng chuyên đi mót mà thôi. Các kiến thức cơ bản về lisp mà mình có được cũng chỉ là bắt đầu từ diễn đàn này, sau đó mày mò tự học và cố gắng tí đỉnh là có thể sử dụng nó phần nào cho công việc của mình. Từ đó có điều kiện để giúp đỡ mọi người mà thôi. Giúp mọi người chính là tự giúp mình nâng cao khả năng của bản thân thôi mà bạn.

Rất mong bạn sẽ sớm trở thành cao thủ về lisp để cùng nhau phát triển bạn nhé.

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

Cám ơn bạn Pham Thanh Binh nhé! Mình sẽ cố gắng!

Xin nhờ ban cùng các bạn trên diễn đàn giúp mình một chút về thuật toán:

Mình có một danh sách list dạng: (("a1" "a2" "a3"...) ("b1" "b2" "b3"...) ("c1" "c2" "c3"...)...)

Xin nhờ các bạn chuyển giùm mình sang dạng: ("a1,a2,a3,..." "b1,b2,b3,..." "c1,c2,c3,..."...) để xuất ra file lưu trữ.

Phần xử lý danh sách mình chưa rành lắm. Mong các bạn giúp cho !

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ạn Pham Thanh Binh nhé! Mình sẽ cố gắng!

Xin nhờ ban cùng các bạn trên diễn đàn giúp mình một chút về thuật toán:

Mình có một danh sách list dạng: (("a1" "a2" "a3"...) ("b1" "b2" "b3"...) ("c1" "c2" "c3"...)...)

Xin nhờ các bạn chuyển giùm mình sang dạng: ("a1,a2,a3,..." "b1,b2,b3,..." "c1,c2,c3,..."...) để xuất ra file lưu trữ.

Phần xử lý danh sách mình chưa rành lắm. Mong các bạn giúp cho !

 

Bạn thử đoạn code này xem:

(setq lst '(("a1" "a2" "a3") ("b1" "b2" "b3") ("c1" "c2" "c3"))
lst1	'()
)
(foreach e lst
(setq str "")
(foreach s e
     (setq str (strcat str "," s))
)
(setq str (vl-string-left-trim "," str)
	lst1 (append lst1 (list str))
)
)
lst1

  • 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 thử đoạn code này xem:

(setq lst '(("a1" "a2" "a3") ("b1" "b2" "b3") ("c1" "c2" "c3"))
lst1	'()
)
(foreach e lst
(setq str "")
(foreach s e
     (setq str (strcat str "," s))
)
(setq str (vl-string-left-trim "," str)
	lst1 (append lst1 (list str))
)
)
lst1

Cảm ơn bạn NACATA và các bạn. Bạn viết nhanh quá, đoạn mã trên chạy tốt rồi. Chúc bạn cùng các bạn mạnh khỏe, hạnh phú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

Xin chào các pác trong diễn đàn cadviet. Xin chỉnh giúp em bài lisp.

     ;---Chuong trinh nay dung de ve banh rang---;
          ;-------------------------;
          ;-------------------------;
          ;-------------------------;
(defun dtor (do)
(*(/ pi 180)do))
          ;-------------------------;
(defun RtoD(doR)
 (*(/ 180 pi)doR))

          ;-------------------------;
(defun cungtrondinh(mot hai)
;          -----Ve cung tron SEC-----
 ; (setq s(getpoint "PdauCungDinhPhai"))(terpri)
 ; (setq c(getpoint "PTam"))(terpri)
 ; (setq e(getpoint  "PcuoiCungDinhTrai"))(terpri)
(command "arc" mot)
  (command "C" tam)
  (command hai))
          ;-------------------------;
(defun cungtronchan()
;          -----Ve cung tron SEC-----
  (setq s(getpoint "PCuoiCungChanPhai"))(terpri)
 ; (setq c(getpoint "PTam"))(terpri)
  (setq e(getpoint  "PcuoiCungChanTrai"))(terpri)
(command "arc" s)
  (command "C" tam)
  (command e))
          ;-------------------------;
(defun cungtron_()
;          -----Ve cung tron SCA----
  ;(setq s(getpoint "Diem giao duong than khai voi vong chia"))(terpri)
 ; (setq c(getpoint "PTam"))(terpri)
 ; (setq a(getreal  "Goc Cung"))(terpri)
(command "arc" s)
  (command "C" tam)
  (command "A" (- goccungTg)))
          ;-------------------------;
(setq N(getint "So rang:"))terpri       ;So rang
(setq m(getreal "modul:"))terpri 
(setq rrr(getint "So doan chia tren chu vi(=:undecided:)			; Ban kinh vong chan
(setq Rcb(* R(cos (dtor 20))))		; Ban kinh vong co ban
(setq tg(*  1.5708 m))			; Chieu dai buoc rang (theo cung vong chia)
(setq goccungTg(*(/ pi(* pi  R))tg))
(setq goccungTg(rtod goccungTg))	;Goc cung chua than rang
(terpri)
(setq tam(getpoint "tam:"))
          ;--------------------------;
(defun vethankhai()                     ; de chuan bi ve duong than khai
(setq dsdiem nil)
(terpri)


(command "circle" tam rcb)
(setq vt(entlast))
(setq chuvi(* rcb 2  pi))
(setq cungnho(/ chuvi rrr))
(setq gocdo 0)(setq dai cungnho)
(setq goc 0)
(setq i 0)(setq dem 0)
(repeat 36

 (setq gocdiem(- (/ pi 2)goc))
  (setq diem(polar tam gocdiem rcb ))
;  (command "point" diem)
; (command "point" diem(polar diem (+ goc(/ pi 1)) dai) )
 (setq  diemtk(polar diem (- (/ pi 1)goc) dai))
         ;------------------------------;
(if (< dem 36)
       (progn
        (setq kc(distance diemtk tam))
     ;   (princ kc)
       (if (<= kc R0)
           (if  (>= kc Rc)
          (setq dsdiem(append dsdiem(list diemtk)))
        )
       )
      )
     )

  (setq i(+ i (/ 360.0 rrr)))
 (setq gocdo i )
 (setq goc (dtor gocdo))
 (setq dai(+ dai cungnho))
(setq dem(+ dem 1)))
;(command "circle" tam (distance tam(nth 0 dsdiem)))
;(command "circle" tam (distance tam(last dsdiem)))

                 ;------VE Duong THAN KHAI-------;
(setq l(-(length dsdiem)1))
(setq i 0)
(command "Pline" (nth 0 dsdiem))
(repeat l
 (setq i(+ i 1))
 (command (nth i dsdiem))
)
(command "" )
(setq thankhai(entlast))
(COMMAND "viewres"  "" 20000 )
)
                ;---------------------------------------; 
(setvar "osmode" 0)
(vethankhai)
(command "erase" thankhai  vt "")
(setq i 1)
(repeat (-(length dsdiem)1)
 (if(<(-(distance tam(nth i dsdiem))r)0.01)
   (setq giao (nth i dsdiem))
 )
 (setq i(+ i 1))
)
(setq s giao)
(vethankhai)
(command "zoom" "extents")
(command "erase" vt "")
(command "circle" tam r)
(setq vc(entlast))
(cungtron_)
(setq cung(entlast))
(command "erase" vc "")
(setq tt(entget cung))
(setq g1(assoc 50 tt))
(setq goc1(cdr g1))
(setq g2(assoc 51 tt))
(setq goc2(cdr g2))
(setq goc_(+ goc1(/(- goc2 goc1)2)))

;(command "line" tam(polar tam goc1  r ) "")
;(command "line" tam(polar tam goc2 r) "")
:***Ve duong doi xung qqua cung
(command "line" tam(polar tam goc_ r) "")
(setq duongdx(entlast))
(setq tt(entget duongdx))
(setq d1(cdr(assoc 10 tt)))
(setq d2(cdr(assoc 11 tt)))
(command "mirror" thankhai ""  d2 d1 "")
(setq thankhaiP(entlast))
(setq aa(entget thankhaiP))
(setq aaa(reverse aa))
(setq Pmut(cdr(assoc 10 aaa)))
(command "erase" duongdx "")
(command "erase" cung "")
(setvar "osmode" 0)
(setvar "osmode" 1)
(command "zoom" "Extents") 
(cungtrondinh Pmut (last dsdiem))
(setq cungdinh(entlast))
(command "zoom" "Extents") 
(command "circle" tam Rc)
(setq Vchan(entlasT))
(command "extend"  Vchan  ""  thankhaiP thankhai "")
(command "array"  thankhai cungdinh thankhaiP "" "p" tam n "" "")
(command "erase" Vchan "")
(command "zoom" "Extents") 
(cungtronchan)
(setq cungchan(entlasT))
(command "array"  cungchan "" "p" tam n "" "")
(command "linetype" "set" "center" "")
(command "circle" tam R)
(command "zoom" "all") 
(setvar "osmode" 0)
(setvar "ltscale" 25)
(setvar "ltscale" 0.25)
(command "linetype" "set" "continuous" "")
(command "zoom" "Extents") 
(command "linetype" "set" "continuous" "")
(prompt "hay chon doi tuong la than rang:")
(COMMAND "pedit" PAUSE "j" "all" "" "")
(setq tl(getstring "co dung 3D ? (Y/n)"))
(if (= tl "Y")
(progn
 (terpri)

 (setq dt(entsel " chi vao banh rang vua ve"))
 (prompt "hay hay chi chieu cao:")
  (COMMAND "extrude" dt "" PAUSE "0")
 (command "vpoint" "R" 45 45)
))
(princ)


 

 

 

 

Em muôn sửa lại là :chỉnh sửa phần đường kính trên đỉnh răng với lại chân răng.như hình vẽ cad sau:

banve

mong các bác sửa giúp em với.

Em 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

Em thường làm việc với bản vẽ quy hoạch trong đó có cos nền hiện trạng, việc lọc cos nền này khá khó khăn, e thường phải cho vào Excel rồi dùng bộ lọc Filter, nhưng điều đó chỉ áp dụng đc khi e dùng Nova, bởi vì trong Nova có công cụ xuất text vào và ra bản vẽ, có lisp nào thực hiện điều đó thay Nova ko? đưa text trên bản vẽ ra file TXT với 3 cột ( cột toạ đọ X, cột toạ đọ Y và cột cao độ Z) sau đó dùng lisp xuất ngwợc vào cad sau khi đã xử lí file TXT trên bằng Excel. nhưng khi xuất vào cad thì chỉ là text bình thường theo đúng toạ độ X, Y Z thôi, không cần phải điền ra vị trí, số thứ tự như nova đâu? mong mọi ng giú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
Em thường làm việc với bản vẽ quy hoạch trong đó có cos nền hiện trạng, việc lọc cos nền này khá khó khăn, e thường phải cho vào Excel rồi dùng bộ lọc Filter, nhưng điều đó chỉ áp dụng đc khi e dùng Nova, bởi vì trong Nova có công cụ xuất text vào và ra bản vẽ, có lisp nào thực hiện điều đó thay Nova ko? đưa text trên bản vẽ ra file TXT với 3 cột ( cột toạ đọ X, cột toạ đọ Y và cột cao độ Z) sau đó dùng lisp xuất ngwợc vào cad sau khi đã xử lí file TXT trên bằng Excel. nhưng khi xuất vào cad thì chỉ là text bình thường theo đúng toạ độ X, Y Z thôi, không cần phải điền ra vị trí, số thứ tự như nova đâu? mong mọi ng giúp đỡ !

Chào Gatesi

Bạn muốn lọc như thế nào? Xuất như thế nào? thì Tue_NV chưa được hiểu?

Có lẽ bạn nên upload file Excel và file .dwg và nói rõ ràng hơn điều bạn muốn nói.

Nói càng rõ ràng, càng minh hoạ, càng chi tiết thì càng tốt bạn ạ.

 

Chúc vui 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
Chào Gatesi

Bạn muốn lọc như thế nào? Xuất như thế nào? thì Tue_NV chưa được hiểu?

Có lẽ bạn nên upload file Excel và file .dwg và nói rõ ràng hơn điều bạn muốn nói.

Nói càng rõ ràng, càng minh hoạ, càng chi tiết thì càng tốt bạn ạ.

 

Chúc vui vẻ

http://www.mediafire.com/?memevwlj33z

đây là file của e, trong đó nói rõ yêu càu, mong a giúp cho, thông cảm vì lúc e post bài chức năng upload của diễn đàn bị lỗi,

Chúc cả nha cuối tuần vui 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×