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

Viết Lisp theo yêu cầu

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

chào mọi người .mình là thành viên mới có vấn đề cần nhờ mọi người giúp đỡ tí nha. trong bản vẽ này chổ cái BILL OF MATERIAL

các đường line bị đứt đoạn. giờ mình muốn nối lai thành 1 line . thì làm sao cho nhanh đây?. thường thì mình dùng filter để chọn line rồi xoá song nối line lại. nhưng dùng filter th2 nó nổi lên bản object selscetion làm sao để ko hiện len bản này nữa. hay là có thể viết cho mình 1 cái lisp làm việc này được không . thank trước nha mọi người. gấp lắm đó .giúp nhanh nha. help me

http://www.cadviet.com/sub/hupload.php?fok...PR5_D7587_1.zip

Đầu tiên nhắc nhở bạn cân nhắc kỹ trước khi post bài tránh làm người khác khó chịu khi đọc yêu cầu.

Lisp sau cho phép bạn chọn toàn bộ line trong vùng bạn chọn.

 

(Defun c:chonline ( )

(Princ "\nHay chon vung :")

(setq SS (ssget '((0 . "line"))))

(if (Null ss)

(princ "\nKhong tim thay doi tuong nao")

)

(IF (/= NIL SS) (PROGN

(setq Sl (SSLength SS))

(princ (strcat "\nTim thay: <" (itoa sl) "> doi tuong la LINE"))

)

)

(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
thành viên mới nhờ bác hoanh giúp đỡ. bác có thể giúp em làm sao để chọn được các đối tượng là line trong bản bản vẻ gồm có text trong đó không? bình thường thì em dùng filter . co thể làm cho em 1 cái lisp được ko . chọn để xóa các line đó luôn . thank bac nha

Đây bạn : Chọn Line và Text

(defun c:CLT()

(setq doituong (ssget '((0 . "text,line"))))

(princ)

)

to ngocthinh84 : đọc bản vẽ của bạn không hiểu bạn muốn gì thì làm sao giúp đây???

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình có một lisp ghi khoảng cách và cao độ tuyệt đối so với khoảng cách và cao độ gốc (cái này thích hợp cho thiết kế trắc ngang, tính cao độ đào đất yếu và cao độ cống) nhưng format nó không được đẹp lắm. Các bạn có thể giúp mình sửa nó để kết quả tạo ra một leader với Mtext trong đó Mtext gồm 2 dòng: Dòng trên là khoảng cách tương đối so với điểm gốc chọn ban đầu, dòng thứ 2 là cao độ tuyệt đối của điểm được chọn được không?

Xin cảm ơn

 

;*******************************************************************************

***************;

;Ghi cao do, offset cua diem can cu vao diem goc

(defun c:eff ( / pt p1 p01 p02 ent ecopy elev elev1 offset etype txth)

(setvar "osmode" 1)

(command "ucs" "w")

(setq pt (getpoint "\nPick reference point: ")

ent (entget(car(entsel "\nSelect elevation text: ")))

etype (cdr(assoc 0 ent))

txth (cdr(assoc 40 ent))

)

(if (/= etype "TEXT") (progn

(princ "\nThe elevation selection must be a TEXT entity")

(exit))

(setq elev (atof(cdr(assoc 1 ent))))

)

 

(command "layer" "m" "UNSUITABLE" "")

 

(while (setq p1(getpoint "\nPick offset point"))

(setq elev1 (+ elev (- (cadr p1) (cadr pt)))

offset (abs(- (car p1) (car pt)))

p01 (polar p1 (* 3.0 (/ pi 2)) txth)

p01 (polar p01 pi (* 0.9 txth))

p02 (polar p01 0 (* 1.6 txth))

ecopy (list (assoc 0 ent)

(cons 100 "AcDbEntity")

(cons 8 "UNSUITABLE")

(cons 100 "AcDbText")

(assoc 10 ent)

(assoc 40 ent)

(cons 1 (strcat "Cao ®é: " (rtos elev1 2 2)))

(assoc 50 ent)

(assoc 41 ent)

(assoc 51 ent)

(assoc 7 ent)

(cons 71 0)

(cons 72 2)

(list 11 (car p01) (cadr p01) 0.0)

(list 210 0.0 0.0 1.0)

(cons 100 "AcDbText")

(cons 73 2)

)

)

(entmake ecopy)

(setq ecopy (list (assoc 0 ent)

(cons 100 "AcDbEntity")

(cons 8 "UNSUITABLE")

(cons 100 "AcDbText")

(assoc 10 ent)

(assoc 40 ent)

(cons 1 (strcat "K.c¸ch: " (rtos offset 2 2)))

(assoc 50 ent)

(assoc 41 ent)

(assoc 51 ent)

(assoc 7 ent)

(cons 71 0)

(cons 72 2)

(list 11 (car p02) (cadr p02) 0.0)

(list 210 0.0 0.0 1.0)

(cons 100 "AcDbText")

(cons 73 2)

)

)

(entmake ecopy)

(princ "\nPress ESC or SPACE bar to cancel")

)

(end_task)

)

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ác nào có lisp có chức năng insert 1 item vào 2 đầu đường line mà mình vẽ không ạ?

 

Ví dụ như em vẽ cốt thép thì nó tự chèn 2 cái móc vào 2 đầu ( 2 cái móc này lại đối xứng nhau ) hay em vẽ cốt thép mũ thì nó tự chèn 2 đoạn thẳng vuông góc với đường line em vừa vẽ.

 

cothep.jpg

 

Hoặc bác nào có thể viết giúp em 1 cái được không ạ?

 

Đa tạ, đa tạ!

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
Anh Hoành cho em hỏi tại sao câu lệnh này Lisp báo lỗi "too many arguments":

(action_tile "load" "(setq filename (getfiled "Doc file so lieu" "" "txt" 1))")

Mong trả lời giúp. Thank,

Bạn hãy sửa thành:

(action_tile "load" "(setq filename (getfiled \"Doc file so lieu\" \"\" \"txt\" 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ác nào có lisp có chức năng insert 1 item vào 2 đầu đường line mà mình vẽ không ạ?

 

Ví dụ như em vẽ cốt thép thì nó tự chèn 2 cái móc vào 2 đầu ( 2 cái móc này lại đối xứng nhau ) hay em vẽ cốt thép mũ thì nó tự chèn 2 đoạn thẳng vuông góc với đường line em vừa vẽ.

 

cothep.jpg

 

Hoặc bác nào có thể viết giúp em 1 cái được không ạ?

 

Đa tạ, đa tạ!

Bạn hãy upload 1 file lên, chúng tôi sẽ tạo lisp cho bạ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
a. tại cái khung có vẽ mây lại đó . mình muốn xoá hết các line bị đứt và nối lại thành 1 line ma thôi. có cách nào hay không . chỉ dùm nhe

Bạn xài thử cái lisp này của bác ssg xem nhé.

(defun c:nn (/ tdt ssdt sodt index)
(defun ObjName (ssdt /)
(cdr (assoc '0 (entget ssdt)))
)
(defun MoPL (ssdt /)
(= (cdr (assoc '70 (entget ssdt))) 0)
)
(defun NoiPL (ssdt /)
(if (MoPL ssdt)
(command ".PEDIT" ssdt "J" (ssget) "" "")

)
)
(defun NoiLC (ssdt /)
(command ".PEDIT" ssdt "Y" "J" (ssget) "" "")

)
(setq
tdt (ssget)
sodt (sslength tdt)
index 0
)
(repeat sodt
(setq
ssdt (ssname tdt index)
index (1+ index)
)
(if (or (= (Objname ssdt) "LWPOLYLINE")
(= (Objname ssdt) "POLYLINE")
)
(NoiPL ssdt)
)
(if (or (= (Objname ssdt) "LINE") (= (Objname ssdt) "ARC"))
(NoiLC ssdt)
)
)
(princ)
)

Hy vọng bạn hài lòng.

Cách xài:

1/- load lisp váo cad

2/- gõ lệnh nn

3/- Chọn đối tượng theo cửa sổ

4/- Nhân Enter.

5/- kiểm tra kết quả.

  • 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ác nào có lisp có chức năng insert 1 item vào 2 đầu đường line mà mình vẽ không ạ?

Ví dụ như em vẽ cốt thép thì nó tự chèn 2 cái móc vào 2 đầu ( 2 cái móc này lại đối xứng nhau ) hay em vẽ cốt thép mũ thì nó tự chèn 2 đoạn thẳng vuông góc với đường line em vừa vẽ.

cothep.jpg

Hoặc bác nào có thể viết giúp em 1 cái được không ạ?

Đa tạ, đa tạ!

Đây chỉ là các Dynamic blocks, select đối tượng, click vào các mũi tên xanh, thay đổi, move... hãy tự khám phá thêm sẽ thấy...

http://www.cadviet.com/upfiles/Dynamic_Cages__Rebars.zip

  • 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ác Kỹ sư có thể post file dưới dạng cad2004 không ạ. Cho anh em mót với ạ.

Thanks bác trước.

 

Hi hi, cái file kia là em post lên để bác nào viết hộ em dễ hình dung thôi mà bác! :cry:

 

Đây chỉ là các Dynamic blocks, select đối tượng, click vào các mũi tên xanh, thay đổi, move... hãy tự khám phá thêm sẽ thấy...

http://www.cadviet.com/upfiles/Dynamic_Cages__Rebars.zip

 

Cái này là thể hiện cốt thép trên tiết diện chứ không phải là vẽ cốt thép trên mặt bằng sàn mà em cần bác ạ

Dù sao cũng cảm ơn bác, cái này cũng sẽ dùng nhiều đây! :cry:

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ác nào có lisp có chức năng insert 1 item vào 2 đầu đường line mà mình vẽ không ạ?

 

Ví dụ như em vẽ cốt thép thì nó tự chèn 2 cái móc vào 2 đầu ( 2 cái móc này lại đối xứng nhau ) hay em vẽ cốt thép mũ thì nó tự chèn 2 đoạn thẳng vuông góc với đường line em vừa vẽ.

 

cothep.jpg

 

Hoặc bác nào có thể viết giúp em 1 cái được không ạ?

 

Đa tạ, đa tạ!

Bạn dùng thử Code này xem :

;VE THEP AM
(DEFUN C:SAM (/ OLDERR CMD OSM DK PT1 PT2  STR PRPT GOCX 
			PTD PTC)
(SETQ OLDERR *error*
     *error* myerror)
(command "layer" "m" "thep" "c" "1" """")
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETVAR "CMDECHO" 0)
(SETQ DK (GETVAR "USERR3"))
(IF (= DK 0)
   (PROGN
    (SETQ STR "100")
    (SETVAR "USERR3" 100)
   )	
   (SETQ STR (RTOS DK))
)
(SETQ PRPT (STRCAT "do dai moc: :"))
(SETQ DK (GETREAL PRPT))
(IF (= DK NIL)
   (SETQ DK (GETVAR "USERR3"))
   (SETVAR "USERR3" DK)
)
(INITGET 7)
(SETQ PTD (GETPOINT "\nFrom point:"))
(INITGET 7)
(SETQ PTC (GETPOINT PTD "\nTo point:"))
(SETVAR "OSMODE" 0)
(SETQ GOCX (ANGLE PTD PTC))

(SETQ PT1 (POLAR  PTD  (- GOCX  (/ pi 2))   (* 1 DK)))
(SETQ PT2 (POLAR  PTC  (- GOCX  (/ pi 2))   (* 1 DK)))
(COMMAND "PLINE"   pt1 ptd ptc pt2   "")
(SETVAR "OSMODE" OSM)
(SETVAR "CMDECHO" CMD)
(PRINC)
)
;VE THEP DUOI
(DEFUN C:SDuong (/ OLDERR CMD OSM DK PT1 PT2 PT3 PT4 PT5 PT6 STR PRPT GOCX GOCY
			PTD PTC)
(SETQ OLDERR *error*
     *error* myerror)
(command "layer" "m" "thep" "c" "1" """")
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETVAR "CMDECHO" 0)
(SETQ DK (GETVAR "USERR3"))
(IF (= DK 0)
   (PROGN
    (SETQ STR "100")
    (SETVAR "USERR3" 100)
   )	
   (SETQ STR (RTOS DK))
)
(SETQ PRPT (STRCAT "Duong kinh moc tron :"))
(SETQ DK (GETREAL PRPT))
(IF (= DK NIL)
   (SETQ DK (GETVAR "USERR3"))
   (SETVAR "USERR3" DK)
)
(INITGET 7)
(SETQ PTD (GETPOINT "\nFrom point:"))
(INITGET 7)
(SETQ PTC (GETPOINT PTD "\nTo point:"))
(SETVAR "OSMODE" 0)
(SETQ GOCX (ANGLE PTD PTC))
(SETQ GOCY (+ GOCX (/ PI 2)))
(SETQ PT1 (POLAR PTD GOCX (/ (* 1 DK) 2)))
(SETQ PT2 (POLAR PTC (+ GOCX PI) (/ (* 1 DK) 2)))
(SETQ PT3 (POLAR PT1 GOCY (* 1 DK)))
(SETQ PT4 (POLAR PT2 GOCY (* 1 DK)))
(SETQ PT5 (POLAR PT3 GOCX (* 1 DK)))
(SETQ PT6 (POLAR PT4 (+ GOCX PI) (* 1 DK)))
(COMMAND "PLINE" PT5 PT3 "A" PT1 "L" PT2 "A" PT4 "L" PT6 "")
(SETVAR "OSMODE" OSM)
(SETVAR "CMDECHO" CMD)
(PRINC)
)

Chúc thành công :cry:

  • 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

oh.cảm ơn bác thanhbinh nhe.nhưng mà nó vẫn chưa được bác ạ. nó chỉ nối lại thành pline thôi chứ chưa phải lá một line. bác có thể giúp em làm 1 cái lisp xoá các line đó được kô a. .thank

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 dùng thử Code này xem :

.....

Chúc thành công :cry:

 

Oh yeah!!!

 

Hơn cả mong đợi. Cảm ơn bác rất nhiều!

 

Chả là em đang làm ĐATN, vẽ cái MB cốt thép sàn mà chơi tay bo không lại.

 

 

Thanks bác lần nữa! :cry:

Chúc bác thành công trong cuộc sống!

 

======================

 

Sau một hồi sử dụng thì em thấy có cái chưa được thuận tiện lắm

Đó là mỗi lần vẽ thì lisp lại yêu cầu nhập lại kích thước các móc.

Bác có thể sửa lại cho nó lưu kích thước các loại móc và kích thước của móc tròn riêng, móc vuông riêng được không ạ?

 

Tức là mỗi khi ap cái lisp đó, trước khi vẽ thì mình set kích thước của các loại móc

Sau đó mỗi lần gõ lệnh vẽ (sam hay sduong như bác đã đặt) là bắt đầu vẽ luôn

 

Cảm ơn bác rất 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
Đó là mỗi lần vẽ thì lisp lại yêu cầu nhập lại kích thước các móc.

Bác có thể sửa lại cho nó lưu kích thước các loại móc và kích thước của móc tròn riêng, móc vuông riêng được không ạ?

 

Tức là mỗi khi ap cái lisp đó, trước khi vẽ thì mình set kích thước của các loại móc

Sau đó mỗi lần gõ lệnh vẽ (sam hay sduong như bác đã đặt) là bắt đầu vẽ luôn

 

Cảm ơn bác rất nhiều!

Chào bạn kỹ sư :

Có lẽ rằng bạn đã không lường trước đến việc mình sẽ vẽ với các tỉ lệ khác nhau.

. Giả sử bạn đang vẽ trên mặt bằng thép sàn là tỉ lệ 1/100. thì lúc này khi khai báo để vẽ độ dài móc là 100 chẳng hạn .

Nhưng nếu bạn vẽ mặt cắt thép sàn thì chắc chắn bạn phải vẽ với tỉ lệ 1/20 hoặc tỉ lệ 1/25 thì cái độ dài móc không phải là 100 nữa mà là 200 hoặc 250 phải không bạn? nếu set luôn cho bạn kích thước độ dài móc trong Lisp thì sau này bạn sử dụng có vấn đề thì bạn trách mình à? Mình đã lường trước chuyện này rồi. Hơn nữa trong Lisp cũng đã lưu biến độ dài móc rồi, tức là mỗi khi nhập vào thì giá trị đó lưu lại cho mỗi lần sử dụng sau. Bạn có hiểu vấn đề này không?

 

ngocthinh84 : chào bác tue NV đoạn lisp bác cho hay lắm đúng với ý mình. cảm ơn nghe. có thể thêm lệnh xoá hay move vào đoạn lisp đó được kô vật?

Bạn hãy nói rõ hơn. Chưa hiểu ý 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
Tức là mỗi khi ap cái lisp đó, trước khi vẽ thì mình set kích thước của các loại móc

Sau đó mỗi lần gõ lệnh vẽ (sam hay sduong như bác đã đặt) là bắt đầu vẽ luôn

 

Ý của em là có thêm lệnh để set kích thước của các loại móc ạ!

Và sau này muốn vẽ với kích thước khác thì set lại đượ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

Chào bạn kỹ sư :

Có lẽ rằng bạn đã không lường trước đến việc mình sẽ vẽ với các tỉ lệ khác nhau.

 

Vâng, em còn phải vẽ mặt cắt của các dầm nữa mà, lúc đó sẽ dùng kích thước khác

 

Hơn nữa trong Lisp cũng đã lưu biến độ dài móc rồi, tức là mỗi khi nhập vào thì giá trị đó lưu lại cho mỗi lần sử dụng sau. Bạn có hiểu vấn đề này không?

 

Vâng, thì cũng chỉ phải nhấn Enter hoặc Space thêm có 1 lần

Có điều, độ dài móc vuông khác với đường kính của móc tròn trong khi biến mà lisp lưu lại dùng chung cho cả 2 lệnh vẽ các loại thép. Trong khi em thay đổi các loại thép liên tục

 

 

Thực ra đoạn LISP bác đã cho là quá tuyệt vời rồi! :cry:

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 kỹ sư :

Có lẽ rằng bạn đã không lường trước đến việc mình sẽ vẽ với các tỉ lệ khác nhau.

 

Vâng, em còn phải vẽ mặt cắt của các dầm nữa mà, lúc đó sẽ dùng kích thước khác

Vâng, thì cũng chỉ phải nhấn Enter hoặc Space thêm có 1 lần

Có điều, độ dài móc vuông khác với đường kính của móc tròn trong khi biến mà lisp lưu lại dùng chung cho cả 2 lệnh vẽ các loại thép. Trong khi em thay đổi các loại thép liên tục

Thực ra đoạn LISP bác đã cho là quá tuyệt vời rồi! :cry:

Bạn hãy thay tất cả những chữ USERR3 thành USERR2 trong đoạn Lisp vẽ thép âm thôi nhé.

Đoạn Lisp vẽ thép dương có USERR3 thì không thay.

Hãy chạy thử xem

Chúc thành công :cry:

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
oh.cảm ơn bác thanhbinh nhe.nhưng mà nó vẫn chưa được bác ạ. nó chỉ nối lại thành pline thôi chứ chưa phải lá một line. bác có thể giúp em làm 1 cái lisp xoá các line đó được kô a. .thank

Chào bạn ngocthinh84,

Nếu chỉ để xóa các đường line đó thì đơn giản, nhưng việc vẽ lại các đường line đó mới làm mình đau đầu do các line của bạn sắp xếp lung tung quá, không theo quy luật gì. Việc nối các line thì chỉ có thể chuyển thành pline mới nối được bạn ạ.

Nếu bạn chấp nhận vẽ lại các đường đó bằng tay thì cái líp xóa các line đó đây bạn ạ.

(defun c:nl ()
(setq Oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget (list (cons 0 "LINE"))))
(setq i 0
  n (sslength ss)
  lst '()
)
(While (	   (setq e (ssname ss i)
		 elist (entget e)
   )
   (if (= (car (cdr (assoc 10 elist))) (car (cdr (assoc 11 elist)))) 
	   (progn
			 (setq p1 (cdr (assoc 10 elist))
				   p2 (cdr (assoc 11 elist))
				   lst (append (list p1) lst)
				   lst (append (list p2) lst)
			 )
			 (entdel e)
	   )
	)
	(setq  i (1+ i))
)
(setvar "osmode" oldos)
(princ)
)

 

Mình đang cố nghĩ cách giải quyết hoàn chỉnh vấn đề của bạn mà chưa được. Mong bạn thông cảm.

  • 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

oh.hay lắm cảm ơn bạn nhiều nha. đó là bản vẽ được xuất từ tekla ra mà.sau khi xoá mình sẽ exten từ đường trên cùng xuống vậy.vì mình dùng tự động chỉnh sửa cho tất cả các bản vẻ giống nhau mà kô cần phải mở từng bản lên nên như vậy cũng là tốt rồi. chú7 lúc trước mình dùng filter để chọn line thì nó hiện lên cái bảng filter selection nên kô làm tự động được giờ thì ok rồi. thank bạ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
oh.hay lắm cảm ơn bạn nhiều nha. đó là bản vẽ được xuất từ tekla ra mà.sau khi xoá mình sẽ exten từ đường trên cùng xuống vậy.vì mình dùng tự động chỉnh sửa cho tất cả các bản vẻ giống nhau mà kô cần phải mở từng bản lên nên như vậy cũng là tốt rồi. chú7 lúc trước mình dùng filter để chọn line thì nó hiện lên cái bảng filter selection nên kô làm tự động được giờ thì ok rồi. thank bạn nhiều

Bạn ơi, bạn giải thích hay cho mình biết trang nào chỉ cách "tự động chỉnh sửa cho tất cả các bản vẻ giống nhau mà không cần phải mở từng bản lên" được không? Mình cũng có một số việc phải chỉnh trên hàng loạt bản vẽ, ví vụ đổi chữ "Việt Nam" thành "VIỆT NAM", nhưng mình cứ phải mở bản vẽ lên thì mới cho chạy một đoạn lisp để chỉnh sau đó save lại. Cám ơn 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×