Thứ Hai, 4 tháng 10, 2010

Scale linetype_scale và htach_scale.

Lisp này gồm 2 tiện ích scale rất tiện khi bạn là dân quy hoạch:
+SCLT: Scale tất cả linetypescale của các đối tượng trong vùng chọn theo tỉ lệ nhập vào.
+SCH: Scale tất cả Hatch scale của các đối tượng trong vùng chọn (tự động lọc đối tượng hatch trong vùng chọn) theo tỉ lệ nhập vào.
Bạn copy nội dung và tạo file lisp hay tải file về cũng được!

(defun c:sclt (/)
(if (= tlscl nil)
(setq tlscl1 2.00)
(setq tlscl1 tlscl)
)
(setq
tlscl (GETREAL (strcat "\nBan muon scale linetype bao nhieu lan: <" (rtos tlscl1 2 2) ">"))
)
(if (= tlscl nil)
(setq tlscl tlscl1)
)
(prompt "\nChon doi tuong muon chinh.")
(setq ss (ssget))
(setq c 0)
(setq N (sslength ss))
(while (< c N)
(setq eT (ssname ss c))
(setq e (entget eT))
(setq dtsckt (cdr (assoc 48 e)))
(if (= NIL dtsckt)
(command ".chprop" eT "" "S" tlscl "" "")
(setq dtsc tlsc)
)
(IF (/= NIL dtsckt) (PROGN
(setq dtsc (* (cdr (assoc 48 e)) tlscl))
)
)
(setq e (subst (cons 48 dtsc) (assoc 48 e) e))
(entmod e)
(setq c (1+ c))
)
(command "undo" "end")
(Princ)
)
;;;;;;;;;;;
(defun c:sch (/)
(setvar "CMDECHO" 0)
(command "undo" "be")
(if (= tlsc nil)
(setq tlsc1 2.00)
(setq tlsc1 tlsc)
)
(setq
tlsc (GETREAL (strcat "\nBan muon scale hatch bao nhieu lan: <" (rtos tlsc1 2 2) ">"))
)
(if (= tlsc nil)
(setq tlsc tlsc1)
)
(prompt "\nChon doi tuong muon chinh.")
(setq ss (ssget '((0 . "hatch"))))
(setq c 0)
(SETQ N (SSLENGTH SS))
(while (< c N)
(setq eT (ssname ss c))
(setq e (entget eT))
(setq dtsc (* (cdr (assoc 41 e)) tlsc))
(command "hatchedit" et "p" "" dtsc "")
(setq c (1+ c))
)
(command "undo" "end")
(Princ)
)

Nhà phố

Con nhà phố tình thương mến thương. Nỏ có đồng mà ún nước nửa. :-(

Tiện ích Biện tập và sử dụng thư viện.

Tiện ích thư viện:
Bạn load về giải nén và chép thư mục thuvien vào ổ c, sau đó tạo thêm 2 thư mục TVND và TVCT đường dẩn như sau:
C:/thuvien/tvnd.
C:/thuvien/tvct.
Load file C:/thuvien/goithuvien.lsp lên là bạn đã có trong tay tiện ích biên tập và sử dụng các thư viện rồi.
*Lệnh chính là TV sẽ ra bảng lệnh chính từ đây truy cập vào các thư viện con hoặc gỏ lệnh trực tiếp gọi từng loại thư viện.
-Xuất hiện bảng lệnh chính sau.


*Trong tiện ích thư viện mình chia làm 3 nhóm chính.
-Thư viện có đặt tên.


-Thư viện không đặt tên.


-Thư viện đường dẩn.


*Thư viện có đặt tên gồm 08 thư viện chính:
-Thư viện chi tiết 1: CT1.
-Thư viện chi tiết 2: CT2.
-Thư viện chi tiết 3: CT3.
-Thư viện chi tiết 4: CT4.
-Thư viện chi tiết 5: CT5.
-Thư viện chi tiết bể tự hoại: CTBTH.
-Thư viện chi tiết tam cấp: CTTC.
-Thư viện chi tiết của các loại: CTCU.
-Bảng lệnh chính của thư viện có đặt tên như sau.


-Khi muốn thao tác cho ô hình ảnh nào thì bạn click chuột trái vào ô hình ảnh đó và chọn các nút bên dưới để thực hiện thao tác mong muốn.
-Mình giới thiệu lần lượt tính năng và thao tác từng nút.
+Thoi: Thoát khỏi bảng lệnh.
+Chen: Chèn chi tiết vừa chọn vào bảng vẽ.
+Tao: Tạo mới chi tiết tại ô vừa chọn.Khi chọn chức năng này xảy ra 2 trường hợp:
>Tại vị trí ô chọn chưa tồn tại chi tiết nào: Lisp tiến hành hướng dẩn bạn tạo mới dữ liệu cho ô này, trình tự như sau:
Đầu tiên bạn cần có sẳn chi tiết cần tạo thành thư viện trên bảng vẽ, Zoom cho nó to gần bằng màn bình vì sau này chi tiết được tạo ra sẽ dùng cái ảnh của màn hình hiện hành để hiển thị lên bảng lệnh.
Lisp hỏi: Chon doi tuong muon tao... Bạn chọn tất cả các đối tượng muốn tạo thành chi tiết, khi chọn xong thì enter.
Lisp hỏi: Chon diem chen: Bạn chọn điểm bằng cách click chuột trái, điểm này sau này là điểm chèn cơ sở của chi tiết.
Lisp hỏi: Ten dung de hien thi: Bạn gỏ tên của chi tiết, cái này sẽ hiển thị bên dưới ô ảnh của chi tiết.
OK xong bạn đã tạo được chi tiết mới vào thư viện rồi.
>Tại vị trí ô chọn đã tồn tại chi tiết: Sẽ có bảng hỏi bạn như sau:


-Bạn chọn Thoi thì lisp bỏ qua việc tạo chi tiết mới tại vị trí này và kết thúc.
-Bạn chọn Co thì lisp tiến hành như bước trên và xóa bỏ chi tiết hiện có.
*Các thư viện còn lại cách dùng tương tự bạn tự khám phá nhé

Thứ Bảy, 2 tháng 10, 2010

Thứ Sáu, 27 tháng 8, 2010

Tạo PLINE trong lisp:

Vấn đề vướng khó chịu nhất của bà con (kể cả mình) khi viết lisp là làm việc với pline:
-Trường hợp đơn giản nhất là vẽ 1 pline với số đỉnh bất kỳ sau đó lấy giá trị diện tích của nó miễn cưỡng lắm thì viết như sau:
(DEFUN c:dtpl ( )
(setq a (getpoint "\nChon diem dau tien: "))
(setq b (getpoint a"\nChon diem tiep theo: "))
(command "pline" a b "")
(setq plhoinay (entlast))
(setq a b)
(while (setq b (getpoint a"\nChon diem tiep theo : "))
(command "pline" a b "")
(command "pedit" "m" "L" plhoinay "" "j" "0" "")
(setq plhoinay (entlast))
(setq a b)
)
(command "pedit" plhoinay "c" "")
(command "area" "object" "last")
(setq dientich (getvar "area"))
(alert (rtos dientich 2 2))
(princ)
)

Giải thích lisp trên như sau:

(setq a (getpoint "\nChon diem dau tien: "))
Hỏi chọn 1 điểm trên màn hình và gán cho biến a
(setq b (getpoint a"\nChon diem tiep theo: "))
Hỏi chọn 1 điểm trên màn hình và gán cho biến b
(command "pline" a b "")
Thực hiện lệnh pline vẽ từ a đến b, kết thúc lệnh pline
(setq plhoinay (entlast))
Gán pl vừa tạo cho biến hoinay
(setq a b)
Gán điểm b hiện tại thành điểm a
(while (setq b (getpoint a"\nChon diem tiep theo : "))
Khởi động vòng lặp tồn tại khi điều kiện biến điểm b được gán bằng pick điểm, nếu enter thì kết thúc vòng lặp
(command "pline" a b "")
Thực hiện lệnh pline vẽ từ a đến b, kết thúc lệnh pline.......lưu ý lúc này điểm a chính là điểm b của đoạn trên đã được gán qua nhé
(command "pedit" "m" "L" plhoinay "" "j" "0" "")
Thực hiện lệnh pedit lựa chọn m, chọn pline vừa tạo, chọn pline tạo trong đoạn trước đã gán cho biến plhoinay, chọn J để nối thành 1 pline liên tục
(setq plhoinay (entlast))
Gán pl vừa tạo cho biến hoinay
(setq a b)
Gán điểm b hiện tại thành điểm a
)
kết thúc vòng lặp nếu nhấn enter, lúc này sản phẩm là 1 đường pline hở
Đoạn bên dưới là thủ tục đóng kín pline và lấy giá trị diện tích và báo ra kết quả. Nhưng nếu vùng muốn tính diện tích chứa cả cung tròn thì việt viết nhại theo lệnh pline là rất khó khăn và cuối cùng mình cũng tìm ra giải pháp bắng cách lisp trả hẳn về cad thực hiện xong lệnh pline xong thì lisp tiếp tục chạy.



Bài này Duy đang viết dở nha bạn ........

Thứ Tư, 21 tháng 7, 2010

Hướng dẩn viết DCL bài mở đầu:

Bạn nên theo dỏi theo tên bài viết tăng từ nhỏ tới lớn thì mới đúng trình tự!


Đến đây phần lisp coi như tạm đủ dùng, về cơ bản thì bây nhiêu đó nắm vững và ứng dụng linh hoạt thì làm được ối chuyện. Phần hổ trợ thêm cho lisp mà gần gủi nhất là hộp thoại: Cái này chủ yếu giải quyết khâu oai và màu mè. Kiến thức này của mình cũng ít nhưng cũng mạnh dạn làm vài bài giúp các bạn có khái niệm cơ bản để có thể tự nghiên cứu chuyên thêm tuỳ vào khả năng của mỗi người.

**Chương trình dùng viết hộp thoại: Tất cả các chương trình soạn thảo văn bản. Mình vẫn dùng notepad. Lưu nó ra định dạng *.DCL là được.
**Trong 1 file *.DCL có thể chứa nhiều hộp thoại trong đó:
-Mở đầu bằng
tenhopthoai : dialog {
label = "noidungtieude";

-Kết thúc bằng
}

-Trong đó:
+ tenhopthoai là tên lisp dùng để gọi hộp thoại này (lưu ý đặt tên khác nhau cho các hộp thoại và viết liên tục không khoảng cách)
+ Noidungtieude là nội dung hiển thị phía trên của hộp thoại (Cái này ưng viết sao cũng được có thể có khoảng cách chủ yếu dùng báo tên hoặc chức năng hộp thoại này. Muốn bỏ trống thì label = " ";

**Số dấu {} trong 1 định nghĩa hộp thoại là bằng nhau.
**Hộp thoại chỉ là cái vỏ còn nội dung bên trong, hoạt động thế nào là do lisp quyết định. Trước tiên cứ thiết kế hộp thoại cho ưng ý cái đã, từ từ tính tới nội dung.
*Mẹo: khi viết xong hộp thoại muốn nghía xem nó như nào mà chưa cần viết lisp để gọi hắn lên thì bạn làm như sau:

-Khởi động cad.
-Vào Tools => Autolisp => Visual lisp editor. Nó khở động lên chương trình.
-Bạn vào File => Open và open cái file *.DCL muốn nghía lên.
-Vào Tools => Inter face tools => Preview DCL Editor. Nó sẽ hiện cái hộp thoại lên cho bạn xem trước.

**Mọi hộp thoại ít nhất phải có 1 nút dùng thoát khỏi hộp thoại mà ko thực hiện chức năng nào như sau.
:button {
label = "Cancel";
key = "Cancel";
is_cancel = true;
}


**Bắt đầu là thủ tục để có 1 nút nhấn cho hộp thoại.

:button {
label = "Ten nut 1";
width = 0;
key = "btn_bieuthuc1";
}


Vậy hộp thoại đơn giản như sau:



tenhopthoai : dialog {
label = "noidungtieude";


:button {
label = "Cancel";
key = "Cancel";
is_cancel = true;
}


}




Hình dáng như sau:

Hộp thoại này chỉ có duy nhất nút thoát khỏi hộp thoại. Kết hợp thêm 1 nút nửa để làm việc khác như sau:




tenhopthoai : dialog {
label = "noidungtieude";


:button {
label = "Ten nut 1";
width = 0;
key = "btn_bieuthuc1";
}

:button {
label = "Cancel";
key = "Cancel";
is_cancel = true;
}


}

Hình dáng như sau:

Khi không nói gì thì các nội dung trong hộp thoại sẽ xếp từ trên xuống dưới. Muốn sắp xếp lại thì dùng 2 cú pháp sắp sếp ( xem bài sau).

Chủ Nhật, 4 tháng 7, 2010

Hướng dẩn viết lisp bài 30:

Bạn nên theo dỏi theo tên bài viết tăng từ nhỏ tới lớn thì mới đúng trình tự!


Đáp án đây. Hy vọng bạn đã hoàn thành giống như sau:

(defun c:vht ()
(command "undo" "be")
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)

(Princ "\nChon cac text :")
(setq tapdoituong (ssget '((0 . "text"))))
(setq diemchuan (getpoint "\nChon diem canh le: "))
(setq thutu 0)
(setq sodoituong (sslength tapdoituong))

(while (< thutu sodoituong)
(setq doituong (ssname tapdoituong thutu))
(setq laynoidung (entget doituong))
(setq diemve (cdr (assoc 10 laynoidung)))

(setq xmoi (car diemchuan))
(setq ymoi (cadr diemve))
(setq diemmoi (list xmoi ymoi))

(command "move" doituong "" diemve diemmoi)
(setq thutu (+ thutu 1))
)
(command "undo" "end")
(setvar "osmode" luubatdiem)
(Princ)
)

**Sau đây mình nói về cách lấy thông tin của đối tượng bằng lisp:
Giả sử rằng bạn có đối tượng (doituong) bạn có được bằng cách nào thì tùy. Muốn lấy thông tin từ nó bạn phải làm việc giống như là mở cửa bước vào trong phòng. Dùng hàm enteget:
(setq laynoidung (entget doituong))
Khi đã vào phòng thì có nhiều thứ để lấy. Mổi thông tin của đối tượng có 1 con số đại diện ví dụ điểm canh lề thứ nhất của text là số 10. Dùng hàm cdr và assoc sẽ lấy được thông tin tương ứng với con số đó.
(setq diemve (cdr (assoc 10 laynoidung)))
Mình sẽ gỏ lại bảng các số đại diện như từ điển bạn cần thông số gì thì vào tra nhé. (Một vài cái hay dùng thôi chứ nhiều lắm mình gỏ không nổi, bạn mua sách về lisp sẽ có bảng này).

CHUNG:
Layer của đối tượng: 8
Kiểu của đối tượng: 0
Màu của đối tượng: 62
Tên dạng đường: 6

TEXT:
Nội dung text: 1
Độ lớn text: 40
Style: 7
Điểm canh lề thứ nhất: 10

BLOCK: (INSERT) Lưu ý block thì trong từ điển của cad là đối tượng INSERT
Tên BLOCK: 2
Điểm chèn: 10
Góc quay: 50
Tỉ lệ theo trục X: 41
Tỉ lệ theo trục Y: 42
Tỉ lệ theo trục Z: 43

LINE:
Điểm đầu: 10
Điểm cuối: 11

CIRCLE:
Tọa độ tâm: 10
Bán kính: 40

PLINE: (LWPOLYLINE)
Độ rộng: 43
Số lượng đỉnh: 90

DIMENSION:
Style: 3

Vậy cách lấy thông tin text như sau:
Nội dung text: (setq noidung (cdr (assoc 1 laynoidung)))
Độ lớn text: (setq dolon (cdr (assoc 40 laynoidung)))
Style: (setq style (cdr (assoc 7 laynoidung)))
Điểm canh lề thứ nhất: (setq diemve (cdr (assoc 10 laynoidung)))