3.1.1. Cơ sở thành lập sơ đồ thuật toán
Sơ đồ thuật toán của chương trình được xây dựng trên cơ sở phương pháp tỉ lệ đồng dạng. Các bước của việc thực hiện thuật toán chương trình như sau:
- Xác định tỉ lệ kích thước: tm ttk zt tm ttk xt cbm cbtk Z cbm cbtk Y cbm cbtk X H H d L L d H H d B B d L L d , , , Trong đó:
Lcbtk , Bcbtk , Hcbtk , Httk, Lttk lần lượt là chiều dài, chiều rộng, chiều cao của cabin
tàu thiết kế, chiều cao mạn và chiều dài của tàu thiết kế.
Lcbm , Bcbm , Hcbm , Htm, Ltm lần lượt là chiều dài, chiều rộng, chiều cao của cabin
tàu mẫu , chiều cao mạn và chiều dài của tàu mẫu.
Phụ thuộc vào vị trí điểm đặt cabin khi tạo block mà ta sử dụng tỷ lệ theo chiều dài, chiều rộng, chiều cao giữa kích thước tàu thiết kế và tàu mẫu tương ứng. Ở đây
chỉ sử dụng tỷ lệ theo chiều cao dzt và tỷ lệ theo chiều dài dxt để xác định cao độ
điểm đặt. Bởi vì để trọng tâm cabin được đặt tại giữa tàu thì tọa độ điểm đặt cabin theo phương y phải trùng với tọa độ điểm đặt của tàu mẫu tức là bằng 0.
- Tỷ lệ tm ttk zt H H
d dùng để xác định tỷ lệ điểm đặt cabin theo chiều cao.
- Tỷ lệ tm ttk xt L L
d dùng để xác định tỷ lệ điểm đặt cabin theo chiều dài.
Giả sử điểm đặt cabin được chọn tại vị trí A ((Lns- Ldt),0,Zcbttk ), ta có :
Lns – Ldt = Xcbttk ; ( n – Zcb) = Zcbtm ; ( Zcbtm x dzt ) = Zcbttk
trong đó: Lns - khoảng cách từ gốc tọa độ (giữa tàu) đến vách đuôi tàu
Ldt - khoảng cách từ vách đuôi tàu đến mép sàn đuôi cabin
(điểm chèn block cabin theo phương x tại mép đuôi cabin). n - khoảng cách giả định.
Zcbtm - cao độ điểm chèn cabin vào tàu mẫu.
Zcbttk - cao độ điểm chèn cabin tàu thiết kế.
Ví dụ :
Xác định tọa độ điểm chèn cabin của tàu thiết kế. Biết rằng tàu mẫu và tàu thiết kế có chiều cao mép boong lần lượt là 1700 mm và 2000 mm. Chiều dài tàu mẫu và tàu thiết kế lần lượt là 12000 và 15000. Khoảng cách từ gốc tọa độ ( giữa tàu) đến vách đuôi tàu và khoảng cách từ vách đuôi tàu đến mép sàn đuôi cabin lần lượt là 7000 mm và 1000 mm.
Zcb = 2300 mm
List ((* dxt (- (- 7000 1000))),0,(* dzt 4000))
Ta có:
Tọa độ điểm đặt cabin theo phương z khi chưa nhân tỷ lệ : 4000 - 2300 = 1700 mm
Tọa độ điểm đặt cabin theo phương z thực tế :
Dzt = 2000/ 1700 = 1,1765
→ Zcbttk = 1,1765 x1700 = 2000 mm
Tọa độ điểm đặt cabin theo phương x khi chưa nhân tỷ lệ : - (7000 -1000)=6000
Tọa độ điểm đặt cabin theo phương x thực tế :
Dxt = 15000/ 12000 = 1,25
→ Xcbttk = 1,25 x 6000 = 7500 mm
Vậy điểm đặt mà thuật toán tính ra đối với tàu thiết kế tương ứng trên sẽ có tọa độ là A (-7500,0,2000) → Cabin tàu thiết kế được xác định thông qua các cabin mẫu được lưu dưới dạng block trong đường dẫn:(C:// Program Files //AutoCAD 2007 // Support // *.dwg ) thông qua tỉ lệ kích thước.
3.1.2. Sơ đồ thuật toán
Hình 3.1. Sơ đồ thuật toán chương trình vẽ cabin
Chọn loại tàu:
- Tàu vỏ composite - Tàu hai thân - Tàu vỏ gỗ
4
Cabin tàu thiết kế Chọn loại cabin
- Cabin tàu vỏ composite - Cabin tàu hai thân - Cabin tàu vỏ gỗ
Bắt Đầu Nhập thông số đầu vào: - Chiều dài cabin thiết kế - Chiều rộng cabin thiết kế - Chiều cao cabin thiết kế - Chiều cao mạn tàu thiết kế
Chọn điểm đặt và scale cabin tàu mẫu
3.2. VIẾT PHẦN MỀM VẼ CABIN TÀU DU LỊCH MANG NÉT VĂN HÓA 3.2.1. Xây Dựng Hộp Thoại Cabin 3.2.1. Xây Dựng Hộp Thoại Cabin
Để tiện lợi hơn khi sử dụng lisp trong autocad, thay vì phải gõ tên lệnh và rất khó khăn trong viêc nhớ hết tên lệnh của một chương trình với nhiều hàm tự tạo do người dùng định nghĩa. Ngôn ngữ Dialog Control Langguage (DCL) sẽ hỗ trợ dễ dàng hơn trong việc quản lý lệnh thông qua các nút lệnh trên hộp thoại và sử dụng chương trình dễ dàng hơn.
Autolisp sẽ tương tác với hộp thoại thông qua các từ khóa được người dùng tự đặt tên. Dưới đây là hộp thoại vẽ cabin của chương trình.
Hình 3.2. Hộp thoại vẽ cabin
Sau khi vạch ra ý tưởng về cấu trúc của hộp thoại người viết chương trình cần lưu hộp thoại dưới dạng file: *.DCL.
Để hiển thị hình ảnh trên hộp thoại ta cần tạo ra các file *.SLD và nó được tạo ra bằng cách dùng lệnh mslide để chụp lại hình ảnh trên màn hình giao diện của AutoCAD. Ở đây chương trình có các file *.SLD tương ứng với mẫu cabin:
Cabin bai bien.sld : Hình ảnh mẫu tàu1 xuất hiện khi nhấn nút “cabin bai bien” trên hộp thoại.
Cabin chim yen.sld : Hình ảnh mẫu tàu 2 xuất hiện khi nhấn nút “Cabin chim yen” trên hộp thoại.
Cabin thanh co 01.sld : Hình ảnh mẫu tàu 3 xuất hiện khi nhấn nút “cabin Cabin thanh 1” trên hộp thoại.
Cabin thanh co 02.sld : Hình ảnh mẫu tàu 4 xuất hiện khi nhấn nút Cabin thanh co 2 trên hộp thoại.
Cabin tau hai than.sld : Hình ảnh mẫu tàu 5 xuất hiện khi nhấn nút “Cabin tau hai than” trên hộp thoại.
Cabin nha tho da.sld : Hình ảnh mẫu tàu 6 xuất hiện khi nhấn nút “Cabin nha tho da” trên hộp thoại.
Cabin luu tru thap ba.sld : Hình ảnh mẫu tàu 7 xuất hiện khi nhấn nút “Cabin luu tru thap ba” trên hộp thoại.
Cabin thap ba.sld : Hình ảnh mẫu tàu 8 xuất hiện khi nhấn nút “Cabin thap ba” trên hộp thoại.
Để hộp thoại có thể hoạt động được ta cần tạo file *.LSP trong đó cách thức hoạt động của hộp thoại được mô tả cụ thể thông qua các hàm, dòng lệnh và hoạt động thông qua từ khóa liên kết với hộp thoại .
VECABIN : dialog {
label ="Chuong Trinh Thiet Ke Cabin Tau Du Lich Vo Go va Vo composite";
// bat dau hop thoai : row {
//bat dau cot 1 :boxed_column {
multiple_select = false;
label = " CHON MAU CABIN THIET KE ";
fixed_width = true;
width = 0 ;
//bat dau cot 1 cua cot 1 : boxed_column {
label = " MAU CABIN TAU VO COMPOSITE";
multiple_select = false;
: button {
label ="Cabin bai bien";
key = "CABIN1";
value = 0;
}
label ="Cabin chim yen";
key = "CABIN2";
value = 0;
}
: button {
label ="Cabin thanh co 2";
key = "CABIN3";
value = 0;
}
: button {
label ="Cabin chim yen 2";
key = "CABIN4";
value = 0;
}
}// het cot 1 cua cot 1 // bat dau cot 2 cua cot 1
: boxed_column {
label = " MAU CABIN TAU HAI THAN";
multiple_select = false
: button {
label ="Cabin tau hai than";
key = "CABIN5";
value = 0
}
} // het cot 2 cot 1 // bat dau cot 3 cot 3 : boxed_column {
label = "MAU CABIN TAU VO GO";
multiple_select = false;
: button {
label ="Cabin nha tho Da";
key = "CABIN6";
}
: button {
label ="Cabin luu tru thap Ba";
key = "CABIN7";
value = 0;
}
: button {
label ="Cabin thap ba";
key = "CABIN8";
value = 0;
}
}//het cot 3 cot 1 } //het cot // sang cot 2
: boxed_column { // cot 1 cua cot 2
: column { fixed_width = true;
width = 43;
//bat dau dong 1
// bat dau hop thoai hang 1 cua cot 2
: boxed_row {
label = "Hinh mau";
multiple_select = false;
//bat dau hang
: radio_button {
label = "Chen cabin";
key = "CHEN";
value = 0;
} // het hang 1
// bat dau hang 2 : image_button {
key = "HINH" ; width = 67;
fixed_width = true; fixed_height = true; aspect_ratio = 0.7; color = graphics_foreground ; color = cyan } //het hang 2 }
//het hop thoai hang 1 cua cot 2
}
//het cot 1 cua cot 2 }
// het cot 2 // sang cot 3
: boxed_column {
label = "Nhap kich thuoc cabin ";
fixed_width = true;
width = 2;
height = 2;
: edit_box {
label = " Chieu dai cabin Lmax (m) : = ";
edit_width = 5; key = "Ltk"; value = ""; children_alignment = centered; } : edit_box {
label = " Chieu rong cabin Bmax (m) : = ";
edit_width = 5;
value = "";
children_alignment = centered;
}
: edit_box {
label = " Chieu cao cabin H (m): = ";
edit_width = 5; key = "Htk"; value = ""; children_alignment = centered; } : edit_box {
label = " Chieu cao man tau thiet ke H (m): = ";
edit_width = 5; key = "Ptk"; value = ""; children_alignment = centered; } : edit_box {
label = " Chieu cao dai tau thiet ke L (m): = ";
edit_width = 5; key = "Lttk"; value = ""; children_alignment = centered; } : column { :paragraph {
label = "Thong tin cabin mau";
: paragraph {
label = "Kich thuoc chinh"; : text {
key = "H2";
} : text {
key = "H3";
value = "Chieu rong 2.8 m"; }
: text {
key = "H4";
value = "Chieu cao man 2.6 m"; }
: text {
key = "H5";
value = "Chieu cao man tau mau 1,04m"; }
: text {
key = "H6";
value = "Chieu dai tau mau 12 m"; }
}// het paragraph Thong tin cabin mau } // het paragraph Kich thuoc chinh }// het hop thoai thong tin cabin
// bat dau hop thoai ty le kich thuoc : row { :edit_box{ edit_width =0; value = "2.8"; key = "bcb/hcb1";} : text { label =" <= B/H <="; children_alignment = centered; } : edit_box { key = "bcb/hcb"; children_alignment = right; fixed_width = true;
edit_width = 0;
value = "4.2";
}
}// het hop thoai ty le kich thuoc
spacer = 1;
}//het cot 3 }
//het hop thoai hang
spacer; spacer_1; ok_cancel; }
3.2.2. Giải thuật nhập các thông số đầu vào
Về nguyên tắc, các kích thước của tàu khi nhập vào chương trình phải là số thực dương, do đó cần kiểm tra để tránh các trường hợp kích thước nhập vào là số 0, số âm, kiểu chuỗi,..Dưới đây là thuật toán kiểm tra thông số đầu vào và hạn chế lại khả năng nhập của người dùng:
Thuật toán liên kết hành động giữa hộp thoại và lisp thông qua từ khóa (mẫu cabin 1) (setq cabin 1 bcb/hcb 1.17 bcb/hcb1 1.076 Ltk 10 Btk 2.2 Htk 2.6 Ptk 1.04 Lttk 12000
)// gán giá trị cho các biến
(action_tile "CABIN1" "(setq cabin 1) // hành động thông qua từ khóa liên kết với hộp thoại
(start_image \"HINH\") // bắt đầu hiển thị hình ảnh (fill_image 0 0 (dimx_tile \"HINH\") (dimy_tile \"HINH\") 500)
(slide_image 0 0 (dimx_tile \"HINH\") (dimy_tile \"HINH\") \"CABIN BAI BIEN.sld\")
(end_image) // kết thúc hiển thị hình ảnh
(set_tile \"bcb/hcb\" \"0.916\") // gán giá trị thông số cụ thể cho từng cabin (set_tile \"bcb/hcb1\" \"0.846\")
(set_tile \"H2\" \"Chieu dai L 10 m\") (set_tile \"H3\" \"Chieu rong B 2,2 m\")
(set_tile \"H4\" \"Chieu cao H 2,6 m\")
(set_tile \"H5\" \"Chieu cao man tau Htm 1.04 m\") (set_tile \"H6\" \"Chieu dai tau Ltm 12 m\")
(setq Ltk (atof (get_tile \"Ltk\"))) (setq Btk (atof (get_tile \"Btk\"))) (setq Htk (atof (get_tile \"Htk\"))) (setq Ptk (atof (get_tile \"Ptk\")))
(setq Lttk (atof (get_tile \"Lttk\")))
(setq bcb/hcb (atof (get_tile \"bcb/hcb\"))) (setq bcb/hcb1 (atof (get_tile \"bcb/hcb1\")))
");;
Thuật toán kiểm tra chiều dài cabin L (defun KTL (val why key / L)
;val giá trị chuyển về,why kiểu trả về khi người dùng rời ô nhập bằng chuột hay bằng enter
(setq L (atof val))
;đổi về kiểu số thực
(if (= 1 why)
;; (1 ở đây giá trị trả về của người dùng khi rời khỏi ô nhập kích thước ở đây kiểm tra khi người dùng rời khỏi ô nhập bằng enter)
Thuật toán kiểm tra số liệu đầu vào là số nguyên hay số thực
(progn
(if (not (or (= (type (read val)) 'REAL) (= (type (read val)) 'INT)))
(progn
(alert "L phai la mot so thuc")
(mode_tile key 2) ;; nếu không phải thì trả về vị trí ô nhập cũ và và bôi đen toàn bộ
(mode_tile key 3));;hết hàmprogn
Thuật toán nếu là số 0 thì buộc nhập lại
(progn (if (= 0 L) (progn
(alert "0 khong phai la so can nhap") (mode_tile key 2)
(mode_tile key 3) )
(mode_tile "Btk" 2)))) ;;hết hàm if
Thuật toán nếu là số âm thì buộc nhập lại
(if (Minusp L) (progn
(alert "Khong Duoc Nhap So Am") (mode_tile key 2)
(mode_tile key 3)
);;hết hàm progn );;hết hàm if
);;hết hàmprogn
Thuật toán đưa về vị trí cũ và nhập lại khi người dùng nhập số âm
(progn
(if (not (or (= (type (read val)) 'REAL) (= (type (read val)) 'INT))) (progn
(alert "L phai la mot so thuc") );;hết hàm progn (progn
(if (= 0 L) (progn
(alert "0 khong phai la so can nhap") (mode_tile key 2) (mode_tile key 3) ) ) );;hết hàm progn );;hết hàm if (if (Minusp L) (progn
(mode_tile key 2) (mode_tile key 3) );;hết hàm prong );;hết hàm if );;hết hàm progn );;hết hàm if
);;hết hàm kiểm tra chiều dài cabin do người dùng nhập vào.
3.2.3. Thuật Toán Vẽ Cabin
3.2.3.1. Thuật Toán Nhập Thông số Cabin
Thuật toán nhập thông số đầu vào mẫu tàu 1: (setq Ltk (* 1000 Ltk)
Btk (* 1000 Btk) Htk (* 1000 Htk) Ptk (* 1000 Ptk)) Lttk (* 1000 Lttk))
(setq Lm 10900 // gán chiều dài cabin mẫu. Bm 2200 // gán chiều rộng cabin mẫu. Hm 2600 // gán chiều cao cabin mẫu. Pm 1040 // gán chiều cao đến boong tàu. Lttkm 12000 // gán chiều dài đến boong tàu. ) (setq dx (/ Ltk Lm) //// tính tỷ số đồng dạng và gán biến dy (/ Btk Bm) dz (/ Htk Hm) dzt (/ Ptk Pm) dxt (/ Lttk Lttkm) )
3.2.3.2. Thuật Toán Chèn Cabin Từ Đường Dẫn
Để chương trình hoạt động được thì cabin mẫu cần được lưu ở support và phải đảm bảo rằng đường dẫn đến file cabin mẫu đã được lưu lại trong mục “support file search path” của AutoCAD.
(command "-view" "_nwiso") // Chuyển góc nhìn sang 3D để vẽ cabin 3D (setvar "cmdecho" 0)
// Biến này sẽ cho phép (CMDECHO = 1) hoặc ngăn chặn (CMDECHO = 0) hiển thị các lệnh nhắc nhở trên cửa sổ văn bản AutoCAD. Nó được sử dụng trong AutoLISP như một thủ tục để không làm phiền người dùng với một chuỗi các dây trên dấu nhắc lệnh.
(setvar "OSMODE" 128)
// Xác lập chế độ Osnaps bắt điểm vuông góc.
(setq pt(LIST (* dxt (- 4790)) 0 (* dxt (- 1040)) )) (COMMAND "INSERT"
"CABIN BAI BIEN.dwg" pt 1 1 0
) // mặc định scale theo phương x y và góc xoay lần lượt là 1 1 0 Câu lệnh insert của AutoCAD bao gồm các mục như sau : 1. Enter block name or [?]: tên block cần chèn
2. Specify insertion point or [Scale/X/Y/Z/Rotate/PScale/PX/PY/PZ/PRotate]:chọn điểm chèn cụ thể hoặc scale ba phương/theo phương X/ theo phươngY/ theo phương Z/rotate/vị trí điểm đặt sau khi chèn PX/PY/PZ.
3. Enter X scale factor, specify opposite corner, or [Corner/XYZ] <1>: 1 : Nếu không muốn thay đổi thì mặc định scale theo phương X với tỷ lệ 1:1
4. Enter Y scale factor : 1 : Nếu không muốn thay đổi thì mặc định scale theo phương Y với tỷ lệ 1:1
5. Specify rotation angle <0>:Góc scale cụ thể, nếu không muốn thay đổi thì mặc định là 0
Ứng với 5 câu lệnh đó, khi viết 5 biến vào chương trình lisp tương ứng sẽ là: (command "insert" 1 2 3 4 5)
Khi người dùng không nhập biến như 3, 4 thì dùng dấu "" như sau : (command "insert" 1 2 "" "" 5)
(command "_.Zoom" "0.95")
(setq xscl (ureal 1 "U" "\n Kiem tra ty le scale dx (nhan enter khi chap nhan ) " dx)) // gán giá trị scale theo phương x là dx
(setq yscl (ureal 1 "U" "\n Kiem tra ty le scale dy (nhan enter khi chap nhan )" dy)) // gán giá trị scale theo phương y là dy
(setq zscl (ureal 1 "U" "\n Kiem tra ty le scale dz (nhan enter khi chap nhan ) " dz)) // gán giá trị scale theo phương z là dz
(setq tset (ssget '((0 . "INSERT")))).
3.3. KẾT QUẢ CHẠY CHƯƠNG TRÌNH VẼ TÀU DU LỊCH COMPOSITE 3.3.1. Vẽ loại tàu deep Vee (3 cặp đôi thanh dẫn hướng) 3.3.1. Vẽ loại tàu deep Vee (3 cặp đôi thanh dẫn hướng)
3.3.1.1. Vẽ đường hình loại tàu deep Vee (3 cặp đôi thanh dẫn hướng)
Thông số chính của tàu thiết kế:
Chiều dài lớn nhấtLmax = 12,00 m
Chiều rộng lớn nhất Bmax=3,20m
Chiều cao mạnHmax=1,04 m
Chiều cao mớn nướcT =0,44m
Để vẽ đường hình ta cần khởi động chương trình AutoCAD, chọn menu Ve-Duong Hinh. Hoặc kích vào biểu tượng trên thanh công cụ của AutoCAD
Với mục đích xuất bản vẽ tuyến hình dạng 2D, thực hiện chương trình theo các bước sau
Bước 1: Tại mục chọn loại tàu thiết kế, chọn “loai tau dang deep Vee (3 cap doi huong dong)”.
Tại mục chọn loại bản vẽ đề xuất trên cad, chọn nút nhấn “2D”
Tại mục nhập kích thước hình học của tàu, tiến hành nhập các kích thước Lmax,
Bmax, H, T
Tại mục nhập tỷ lệ kích thước tàu thiết kế, tiến hành nhập các tỷ số đồng dạng L/B, B/H, H/T.
Hình 3.3. Yêu cầu xuất bản vẽ 2D
Bước 2: Nếu muốn xuất bảng tọa độ ra Notepad, tiến hành chọn nút nhấn “Xuất tuyến hình”.Tiến hành nhập tên tàu thiết kế. File .txf sẽ được lưu ở ổ D
Hình 3.4. Yêu cầu xuất tuyến hình ra Notepad
Hình 3.5 Trị số tuyến hình trên Notepad
Hình 3.6 Nhấn nút OK
Bước 4: Nếu muốn xuất bảng tọa độ tàu ra màn hình AutoCAD, tiến hành chọn nút nhất “Ok” và chọn điểm còn chèn bảng tọa độ
Hình 3.8. Nhập điểm cần chèn bảng trị số tuyến hình