Sử dụng AutoLisp trong AutoCad

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,120
Được thích
24,279
Trong lĩnh vực đồ họa (AutoCad), ngôn ngữ lập trình AutoLisp được ứng dụng rộng rãi. Tuy nhiên ngôn ngữ AutoLisp có những hạn chế nhất định và phức tạp. Những lỗi mở ngoặc,đóng ngoặc () rất khó chịu và không phải dễ dàng tìm ra. Sau 1 thời gian nghiên cứu về AutoLisp, tôi ko tiếp tục nữa.
Theo tôi, những bạn ngành kỹ thuật (có dùng AutoCad) nếu biết về VBA for Excel thì nên sử dụng VBA for AutoCad, không nên dùng AutoLisp.

Sau đây tôi giới thiệu tiện ích vẽ mặt cắt địa chất công trình (chưa được hoàn chỉnh) bằng AutoLisp để các bạn tham khảo.

Chương trình gồm 2 file: Matcat.dwg và GTmoi.lsp.
Để chạy chương trình, đầu tiên bạn mở file Matcat.dwg trong AutoCad2004. Sau đó vào Tools/Load Application

matcat1.jpg
 
Cửa sổ Load/Unload Application hiện ra, bạn chọn file GTMoi.lsp trong look in:

matcat2.jpg


Sau đó chọn Load rồi Close. Nếu việc Load thành công thì máy sẽ báo:

matcat3.jpg
 
Để chạy được GTMoi.lsp, đầu tiên bạn đặt chế độ Osnap off.
Sau đó ở dòng command, bạn gõ TL (thước tỷ lệ). Khi vào xong các yêu cầu thì sẽ thoát lệnh.
Dòng command trống xuất hiện, bạn vào HK (Hố khoan), rồi nhập các yêu cầu vào.
Để hiểu hơn các lệnh AutoLisp, mời các bạn xem code:
Mã:
; Ve mat cat dia chat cong trinh
( defun C:TL ( / Saumax )

	(setq Vitri ( getpoint "\nCho vi trí thuoc ty lê:"))
	(setq TLD ( getreal " \nCho ty lê dung: 1/"))
	(setq TLN ( getreal " \nCho ty lê ngang: 1/"))    
	(setq Batdau ( getreal " \nCho cao dô bat dâu= "))
	(setq Saumax ( getreal " \nCho dô sâu hô khoan max= "))
	(command "Color" "7")
	(setq Soo (+( / (* Saumax 100 ) TLD) 1) )
	(setq Vtchu ( polar Vitri 0 4 ))
	(if ( >= Batdau 0) (command "text" "style" "vntime" Vtchu "2" "0" (Strcat "+"( Rtos Batdau 2 1) )))
	(if ( < Batdau 0) (command "text" "style" "vntime" Ghichu "2" "0" (Rtos Batdau 2 1 ) ))
	(setq dem 1 )
    (while (<= dem Soo )
	(setq Vitri1( polar Vitri (-(/ PI 2))  (-(* dem 10) 10 )))
	(setq X1( polar Vitri1 (-(/ PI 2))  10 ) )
	(setq Y1( polar X1 0 1.5 ))
		(command "rectangle" Vitri1 Y1 )
		(if (= (rem dem 2) 0 ) (command "solid" Vitri1 "@1.5,0" "@-1.5,-10"  "@1.5,0" ""))
	(setq Ghichu( polar X1 0 4 ))
	(setq Khdich (/ TLD 100))
	(setq Chu (- Batdau (* dem Khdich )  ) )
	(if ( >= Chu 0) (command "text" "style" "vntime" Ghichu "2" "0" (Strcat "+" ( Rtos Chu 2 1 ) )))
	(if ( < Chu 0) (command "text" "style" "vntime" Ghichu "2" "0" (Rtos Chu 2 1 ) ))
	(setq dem ( + 1 dem ))
    ); end of while
	(command "Color" "1")
	(setq Khch( polar Vitri (-(/ PI 2)) (* (+ Soo 1 ) 10 ) ) )
	(setq Khch1( polar Khch (-(/ PI 2)) 8 ))
	(setq Khch2( polar Khch1 (-(/ PI 2)) 8 ))
	(setq Kh1( polar Khch 0 -15 ))
	(command "line" Kh1 "@0,-24" "@30,0" "@ 0,24" "C" "")
	(setq Kh1chu( polar Kh1 -1.1 5.8))
	(setq Kh2chu( polar Kh1chu (-(/ PI 2)) 7.5))
	(setq Kh3chu( polar Kh2chu (-(/ PI 2)) 7.5))
	(command "Color" "7")
	(command "text" "style" "T3" Kh1chu "2" "0" "Ký hiÖu")
	(command "text" "style" "T3" Kh2chu "2" "0" "Cao ®é HK (m)")
	(command "text" "style" "T3" Kh3chu "2" "0" "Kho¶ng c¸ch (m)")
); end of defun
(defun C:HK()
	; Bat dau vao so lieu cac ho khoan
	(setq Sohk ( getreal "\nCho sô cac hô khoan:"))
	(setq so 1)
           (while (<= so Sohk)
		(setq Chuoi ( getstring ( strcat "\nCho tên HK thu " (rtos so 2 0 )":" )))
		(setq Caodo ( getreal  ( strcat "\nCho cao dô hô khoan thu " (rtos so 2 0 )":" )))
		(setq Ktg ( polar Vitri (-(/ PI 2))  (/(*(- Batdau Caodo) 1000) TLD )  ))	
		(if (= so 1) (setq Khcach 0 ))
		(setq KC (/ (* Khcach 1000 ) TLN))
		(setq K1 ( polar Ktg 0 (+ 25 KC ) ) ) 
		(setq Tg K1)
		(setq Dosau ( getreal ( strcat "\nCho dô sâu hô khoan thu " (rtos so 2 0 )":" )))
		(setq Lop( getint ( strcat " \nCho sô lop hô khoan thu " (rtos so 2 0 )":" )))
		(setq D1( polar Tg 0 1.5 ))
		(setq DC1( polar Tg (-(/ PI 2)) (* Dosau(/ 1000 TLD))) )
		(setq DC2( polar DC1 0 1.5))
		(setq Chuhk( Polar Kh1chu 0 (+ KC 42)))
		(setq Chucaodo( Polar Kh2chu 0 (+ KC 34)))
		(setq Gach( Polar Khch2 0 (+ KC 25 0.75)))
		(setq Tam( Polar Gach (/ PI 2) 12 ))
		(command "Color" "1")
		(command "Circle" Tam "1.3" "")
		(command "line" Tam "@0,1.3" "@0,-2.6" "")
		(command "line" Gach "@ 0, -8" "")
		          ( setq solop 1 )
		     ( while ( <= solop Lop )
    			(command "Color" "1") 
    			( setq Saulop( getreal ( strcat " \nCho dô sâu lop thu " (rtos solop 2 0 )":" )))
			( setq Cddlop(- Caodo Saulop))
    			( setq D2( polar D1 (-(/ PI 2 ))  (* Saulop (/ 1000  TLD) )))
    			( setq D3( polar D2 0 -1.5 ))
    			( setq Ghidosau( polar D2 0.5 1.2 ))
			( setq Ghicaodo( polar Ghidosau 0 -2.8 ))
			  (if (= so 1)    
				( progn
					( command "line" D3 "@ -10,0" "" ) 
					(command "line" D2 "@ 3,0" "" )
				)
			  )	
			  (if (> so 1)
				( progn
					( command "line" D2 "@ 3,0" "")    
					(command "line" D3 "@ -2,0" "" )
				)
			  )
			  (if (= so Sohk) 
				( progn
					( command "line" D2 "@ 10,0" "" )
					(command "line" D3 "@ -2,0" "" )
				)
			  )
			( command "Color" "7")
    			( command "Text" "style" "vn1"  Ghidosau "2.0"  "0" ( Rtos Saulop 2 1))
			( command "Text" "Justify" "R"  Ghicaodo "1.8" "0"(rtos Cddlop 2 2))
    			( setq solop( + 1 solop ))
  		     ); end of while
		(command "Color" "7")	
		(command "line" tg DC1 "" )
	       (if ( >= Caodo 0) (command "text" "style" "T3" Chucaodo "2" "0" (Strcat "+"( Rtos Caodo 2 2) )))
	       (if ( < Caodo  0) (command "text" "style" "T3" Chucaodo "2" "0" (rtos Caodo 2 2 ) ))
		(command "Color" "2")	
		(command "line" DC1 DC2 D1 "")
		(command "Color" "7")
		(command "Text" "style" "T3" Chuhk "2.5" "0" Chuoi )
		(command "Color" "1")
		  (if (= so 1)    
				( progn
					( setq DCD ( polar DC1 0 -10 ))
					( command "line" tg "@ -10,0" DCD "" ) 
				)
		  )	      
		   (if (= so Sohk)    
				( progn
					( setq DCC ( polar DC2 0 10))
					( command "line" D1 "@ 10,0" DCC "" ) 
				)
		  )	   
		   (if (< so Sohk)
			( progn 
		     		(setq Khcach1( getreal ( strcat "\nCho khoang cách hô khoan thu " (rtos (+ so 1) 2 0 ) " toi hô khoan truoc do (m):" )))
                     		(setq Gachgiua( polar Gach (-(/ PI 2 )) 5 )) 
		     		(setq ChuKcach( polar Gachgiua 0 (-( / (* Khcach1 1000) 2 TLN) 2))) 
		     		(command "text" "style" "T3" ChuKcach "2" "0" (rtos Khcach1 2 1 ) ) 
			)
		   )
		(command "redraw" "")
		(setq Khcach (+ Khcach Khcach1 ) )
		(setq so(+ 1 so ))
	     ); end of while so ho khoan
		(setq Kh2 (polar Kh1 (-(/ PI 2)) 8))
		(setq Kh3 (polar Kh2 (-(/ PI 2)) 8))
		(setq Cuoi3 (polar Gach 0 10 ))
		(setq Cuoi2 (polar Cuoi3 (/ PI 2) 8))
		(setq Cuoi1 (polar Cuoi2 (/ PI 2) 8))
		(setq Cuoi4 (polar Cuoi3 (-(/ PI 2)) 8))
		(command "line" Kh2 Cuoi2 "")
		(command "line" Kh3 Cuoi3 "")
		(command "rectangle" Kh1 Cuoi4 )
		(command "Color" "1")

); end of defun
 
Mời các bạn tải file Matcat.dwg. Để tạo file GTmoi.lsp thì bạn có thể copy và dán vào Notepad, đuôi để *.lsp.
 

File đính kèm

  • Matcat.zip
    25.2 KB · Đọc: 1,674
Lần chỉnh sửa cuối:
Trong Notepad, khi em Save as, hộp Name mặc định *.txt. Em chỉ gõ GTmoi.lsp là xong thôi (để AutoCad tự nhận dạng ứng dụng).

Lưu ý: Bài không dấu lần sau là bị xóa đấy nhé!
 
AutoLisp có cái hay là xử lý nhanh nhưng mệt nhất là mấy cái ngoặc, mở ra thì nhớ phải đóng vào, không thì không biết đâu mà tìm lỗi.
Thế mới có câu vui về LISP (Lost In Stupid Parentheses). Nói gì thì nói nhưng tìm hiểu sâu về AutoLisp (bây giờ là Visual Lisp) thì cũng rất hay đấy.
 
Dạ em load đựoc rồi nhưng khi vào Cad và nhập số liệu như sau:
Ti le dung:1/100
Ti le ngang: 1/200
Cao do bat dau: 20
Chieu sau ho khoan max: 15
Đến đây thì báo lỗi là: ; error: Function cancelled
Em không hiểu mong thầy chỉ giúp
 
Để chạy được ứng dụng trên, bạn phải sử dụng nền Matcat.dwg. Vì trong đó tôi đã khai bóa kiểu font, đường nét,... Nếu chạy trên file dwg chưa khai báo thì nó sẽ báo lỗi, vì nó không nhận được font có sẵn.
 
Em đã dùng thử chương trình của thầy rồi, rất hiệu quả khi vẽ mặt cắt. Bọn em đang gặp khó khăn khi thiết lập các mặt cắt mới trong bhatch. Thầy post code các mặt cắt mới giúp chúng em với.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em bổ sung các kiểu tô mặt cắt trong file Acad.pat

Mã:
 *DATLAP, Tô ký hiệu đất lấp
0,0,0,0,0.6,0.3,-0.3
0,0,0.1,0,0.6,0.3,-0.3
90,0.1,-0.1,0,0.6,0.3,-0.3
90,0.2,-0.1,0,0.6,0.3,-0.3
*BUN, Tô ký hiệu bùn
0,-0.2,0.1,-0.6,0.6,0.1,-1.1
0,0.1,-0.1,-0.6,0.6,0.1,-1.1
45,-0.3,0,0,0.8485281374,0.1414213562,-0.7071067812
45,0.2,-0.1,0.8485281374,0.8485281374,0.1414213562,-0.7071067812
135,0.1,-0.1,0,0.8485281374,0.2828427125,-0.5656854249
*Bazan, Tô ký hiệu đất Bazan
270, 0,0, .25,.433, .1,-.4
30, 0,0, .25,.433, .1,-.4
150, 0,0, .25,.433, .1,-.4
*Botket, Tô ký hiệu đá bột kết
0, 0,0, 0,1.866
330, 0,0, 1.866,3.2321, .5,-3.2321
300, .433,-.25, 3.2321,1.866, .5,-5.9641
270, .683,-.683, 1.866,3.2321, .5,-3.2321
240, .683,-1.183, 3.2321,1.866, .5,-5.9641
210, .433,-1.616, 1.866,3.2321, .5,-3.2321
210, 1.366,0, 1.866,3.2321, .5,-3.2321
240, .933,-.25, 3.2321,1.866, .5,-5.9641
300, .683,-1.183, 3.2321,1.866, .5,-5.9641
330, .933,-1.616, 1.866,3.2321, .5,-3.2321
0, 1.549,-.933, 3.2321,1.866, 1,-.866025,1,-.866025,1,-1.7321
 
Tiếp tục
Mã:
*BotketVoi, Tô ký hiệu đá bột kết vôi
0, 0,0, 0,1.866
330, 0,0, 1.866,3.2321, .5,-3.2321
300, .433,-.25, 3.2321,1.866, .5,-5.9641
270, .683,-.683, 1.866,3.2321, .5,-3.2321
240, .683,-1.183, 3.2321,1.866, .5,-5.9641
210, .433,-1.616, 1.866,3.2321, .5,-3.2321
210, 1.366,0, 1.866,3.2321, .5,-3.2321
240, .933,-.25, 3.2321,1.866, .5,-5.9641
300, .683,-1.183, 3.2321,1.866, .5,-5.9641
330, .933,-1.616, 1.866,3.2321, .5,-3.2321
0, .991,-.933, 3.2321,1.866, 1,-.616025
270, 3.9151,0, 1.866,3.2321, 1.866,-1.866
*CatketMin, Tô ký hiệu đá cát kết hạt mịn
0, 0,0, 0,1.866
330, 0,0, 1.866,3.2321, .5,-3.2321
300, .433,-.25, 3.2321,1.866, .5,-5.9641
270, .683,-.683, 1.866,3.2321, .5,-3.2321
240, .683,-1.183, 3.2321,1.866, .5,-5.9641
210, .433,-1.616, 1.866,3.2321, .5,-3.2321
210, 1.366,0, 1.866,3.2321, .5,-3.2321
240, .933,-.25, 3.2321,1.866, .5,-5.9641
300, .683,-1.183, 3.2321,1.866, .5,-5.9641
330, .933,-1.616, 1.866,3.2321, .5,-3.2321
0, 2.2465,-.933, 3.2321,1.866, .07,-1.563525,.07,-1.563525,.07,-3.12705
 
Em cảm ơn thầy rất nhiều, cả phần tô mặt cắt em cũng chạy đc rồi
 
Chào anh Hướng.
Tôi cũng làm về ĐCCT; rất thích lập trình AutoLISP, VB, VBA, C++... nhưng khi lập chương trình vẽ mặt cắt vẫn còn gặp khó khăn về thuật toán nối các ranh giới địa chất lại với nhau (vì địa chất thường bất đồng nhất - thế mới khó chứ!).
Anh có thể giúp tôi được không?
Thanks!
 
Cái bạn hỏi là tương đối khó. Các phần mềm chuyên nghiệp vẽ mặt cắt cũng đang bí, chỉ có LOGMAN đã giải quyết được. Nhưng đó lại là bí mật của họ, bạn có thể hỏi thêm ở www.geosoftvn.com (anh Long làm Admin).
Trong trường hợp các lớp đất cùng có thì ta có thể nối thuần túy đơn giản khi khai báo độ sâu ở dạng mảng. Tuy nhiên, việc nối này chỉ hợp lý khi cao độ lớp đất này không thay đổi nhiều, còn trường hợp biến đổi mạnh thì lại bất hợp lý.
Quan trọng nhất là ta phải tìm được thuật toán thì mới giải quyết được vấn đề hóc búa trên. ;;;;;;;;;;; ;;;;;;;;;;;
 
Thầy ơi dùng cái của thầy khó quá thấy up cho em 1 cái trong excel đi, cái đó dễ hơn.
 
Vẽ mặt cắt ĐCCT tốt nhất là dùng Autocad, Excel không thể làm được đâu. Nếu có điều kiện bạn học thêm cả VBA for AutoCad thì hiệu quả sẽ cao hơn.
 
Thêm 1 tiện ích vẽ hình trụ hố khoan, tuy không được hay lắm nhưng tôi cứ post lên cho các bạn tham khảo.
Cái này thì phải đọc kỹ hơn và không cần file gốc để chạy trên nền.
 

File đính kèm

  • Hinhtru.zip
    4.9 KB · Đọc: 249
PhuocAF đã viết:
Binh !
Anh co mot doan chuong trinh cua AutoCAD. khong biet post len GPE co tie^.n khong, Thay anh PhanTuHuong cung mot so ban khac cung co bai ve AutoCAD. neu Binh thay duoc thi post len dum anh de gop cung dien dan.
Cam on.
PhuocAF.
Em nhận được file của anh PhuocAF về AutoCAD, gởi lên để mọi người tham khảo
 

File đính kèm

  • TV.rar
    1.7 MB · Đọc: 590
nguyen hoai thanh rung đã viết:
em da dung thu chuong trinh cua thay,em thay ko lam ro dc dia hinh khi ve mc,va phai tu bhatch rat bat tien so voi chuong trinh cua chu vuong (tedi).co cach nao lam dc nhu cua chu vuong ko
neu mua chuong trinh cua chu vuong phai mat tien,ma em dang lam do an chua co tien

Em phải biết rằng AutoLisp chỉ là lập trình ứng dụng trong AutoCad nên có những hạn chế nhất định. Không thể so sánh ứng dụng nhỏ mang tính tiện ích với chương trình lớn được.
Để lập được CT như anh Vượng hay anh Long (Logman) thì phải tốn bao công sức, kinh nghiệm, trí tuệ,... Ngôn ngữ viết chương trình là Visual Basic. Các anh đấy bán tiền triệu thì cũng đúng thôi.

Tôi viết cái này đã lâu và đã nhìn được cái hạn chế của AutoLips nên không phát triển nữa, và có muốn cũng chẳng được như các chương trình trên.

Tôi khuyên nên sử dụng thành thạo Excel và AutoCad đã rồi sử dụng các tiện ích ứng dụng trong công việc, sau đó muốn phát triển gì thì phát triển. Không nên lệ thuộc vào các sản phẩm của người khác lập ra, chẳng may bị lỗi thì cứ loay hoay thôi. Mình đã sử dụng sản phẩm của người khác thì nên chấp nhận, nếu có khả năng thì tự bổ sung khắc phục những hạn chế. Phải làm Thợ tốt đã thì mới lên được Thầy em à.

Chú ý bài viết phải có dấu em nhé!
 
em chưa hiểu cách tạo file GTmoi.*lsp. thầy giúp em với em làm giống như thầy mà không được
 
Web KT
Back
Top Bottom