LSP, Orientasi Penyusunan Program.

Aku tidak akan mengulas panjang lebar disini, akan aku usahakan nantinya untuk membuat penjelasan dalam topik lain. Aku berharap, apa yang aku tulis disini akan memjadi sebuah tuntutan minimal. bahwa sebuah program Lsp HARUS bisa menjadi kemudahan dalam bekerja, tidak hanya dalam bentuk gambar, TETAPI harus membantu menyelesaikan Bagaimana bentuk yang seharusnya dipakai pada suatu tatanan tertentu maupun penghitungan matematis. Mudah-mudahan apa yang saya tulis pendek ini bisa memberikan gambaran dan bermanfaat bagi yang membaca. Disini, penggunaan Variabel akan saya usahakan memberikan informasi arti.

1.    Varian masukan

Sebuah LISP, idealnya dibuat untuk banyak dimensi. Membuat suatu obyek dengan LISP, JANGAN hanya berfikir untuk keperluan gambar yang sekarang saja. Sebagai contoh sederhana adalah sebuah Kotak dengan acuan di titik kiri bawah, kotak ini nantinya akan selalu terbawa kedalam banyak kepentingan jenis gambar dan ukuran

[sourcecode language=’cpp’]
(defun c:kotak (/ osn panjang lebar acuan pt1 pt2 pt3)
(setvar “cmdecho” 0)
(setq osn (getvar “osmode”))
(setvar “osmode” 0)
(setq panjang (getdist “\n Panjang : “)
lebar (getdist “\n Lebar : “)
acuan (getpoint “\n Titik acuan : “)
pt1 (polar acuan 0 panjang)
pt2 (polar pt1 (/ pi 2) lebar)
pt3 (polar acuan (/ pi 2) lebar)
); setq
(command “pline” acuan pt1 pt2 pt3 “c”)
(setvar “osmode” osn)
(princ)
); defun
[/sourcecode]

load dan jalankan perintah KOTAK, semua kotak dengan berbagai ukuran panjang yang dikehendaki akan terbentuk.

2.    Library Program

Sebuah kotak, adalah sebuah bentuk dasar dari berbagai bentuk. sekali anda selesai menyelesaikan program untuk bentuk ini, jangan berfikir hanya untuk kepentingan gambar sebuah kotak saja. tetapi usahakan untuk nantinya bisa dimanfaatkan untuk kepentingan obyek gambar lain. sehingga kalau memungkinkan, sebuah routine yang sudah ditulis, diupayakan untuk menjadi subroutine

sehingga, koreksi dari program nomor satu adalah sebagai berikut :

[sourcecode language=’cpp’]
 (defun box () ;; bagian ini ditulis tanpa prompt C
(setvar “cmdecho” 0)
(setq osn (getvar “osmode”))
(setvar “osmode” 0)
(setq panjang (getdist “\n Panjang : “)
lebar (getdist “\n Lebar : “)
acuan (getpoint “\n Titik acuan : “)
pt1 (polar acuan 0 panjang)
pt2 (polar pt1 (/ pi 2) lebar)
pt3 (polar acuan (/ pi 2) lebar)
); setq
(command “pline” acuan pt1 pt2 pt3 “c”)
(setvar “osmode” osn)
(princ)
); defun
[/sourcecode]

disini BOX adalah sebuah subroutine untuk SELURUH program gambar lain yang membutuhkan bentuk kotak. sehingga terapan untuk penulisan kotak menjadi seperti dibawah.

Box sebagai sub routine sebuah kotak, box diatas harus selalu ikut di load dalam program autocad

[sourcecode language=’cpp’]
(defun c:kotak () ;;command dengan prompt C yang merupakan routine KOTAK yang sebenarnya
(box)
)
[/sourcecode]

atau anda bisa juga menggunakan alternatif berikut
disini, panjang dan lebar kita pakai sebagai input langsung tanpa prompt pesan / message.

[sourcecode language=’cpp’]
(defun box1 (panjang lebar) ;; bagian ini ditulis tanpa prompt C
(setvar “cmdecho” 0)
(setq osn (getvar “osmode”))
(setvar “osmode” 0)
(setq acuan (getpoint “\n Titik acuan : “)
pt1 (polar acuan 0 panjang)
pt2 (polar pt1 (/ pi 2) lebar)
pt3 (polar acuan (/ pi 2) lebar)
); setq
(command “pline” acuan pt1 pt2 pt3 “c”)
(setvar “osmode” osn)
(princ)
); defun
[/sourcecode]

ATAU

[sourcecode language=’cpp’]
(defun box2 (panjang lebar acuan) ;; bagian ini ditulis tanpa prompt C
(setvar “cmdecho” 0)
(setq osn (getvar “osmode”))
(setvar “osmode” 0)
(setq pt1 (polar acuan 0 panjang)
pt2 (polar pt1 (/ pi 2) lebar)
pt3 (polar acuan (/ pi 2) lebar)
); setq
(command “pline” acuan pt1 pt2 pt3 “c”)
(setvar “osmode” osn)
(princ)
); defun
[/sourcecode]

terapannya,
[sourcecode language=’cpp’]
(defun c:kotak1 () ;;command dengan prompt C yang merupakan routine KOTAK
(box1 150 150)
)
[/sourcecode]

setiap kali anda menjalankan perintah kotak1, akan tergambar kotak dengan ukuran 150X150

3.    Library Obyek

peruntukan program kotak awal akan dipergunakan sebagai library program. sehingga apabila program diatas sudah di load, program selanjutnya bisa kita manfaatkan.

misal, sebuah denah jendela sederhana, yang membutuhkan kotak di sisi kiri dan kanan dengan dimensi kusen 50X150

[sourcecode language=’cpp’]
(defun c:jendela ()
(setq osn (getvar “osmode”))
(setq leb_jen (getdist ” \lebar jendela : “))
(setvar “osmode” 0)
(box1 50 150)
(command “line” pt1 (setq pt4 (polar pt1 0 leb_jen)) “”
“line” (polar pt1 (/ pi 2) 75) (polar pt4 (/ pi 2) 75) “”
“line” pt2 (polar pt2 0 leb_jen) “”
)
(box2 50 150 pt4)
(setvar “osmode” osn)
(princ)
)
[/sourcecode]

jalankan dari program autocad

Command : Jendela ENTER
lebar jendela : 700 ENTER

pick point, akan tergambar jendela sederhana dengan bukaan 700

disini beberapa variabel seperti pt1, pt2, pt3 tidak perlu didefinisikan ulang, karena sudah tertulis dalam sub routine BOX1.
anda tinggal menggunakan perintah box1 atau box2 untuk berbagai obyek gambar yang dikehendaki yang memerlukan gambar obyek kotak.

4. Memberikan alternatif bentuk

misalnya, apabila kotak yang akan tergambar,
1. lebar < 100, maka kotak akan disilang
2. lebar = 100, ditengah kotak ada lingkaran
3. lebar > 100, ada tanda plus ditengah kotak

terapannya,

[sourcecode language=’cpp’]
(defun c:bentuk ()
(box)
(if (< lebar 100) (command "line" acuan pt2 "" "line" pt1 pt3 "")) (if (= lebar 100) (command "circle" (polar acuan (angle acuan pt2) (/ (distance acuan pt2) 2.0)) (/ lebar 4.0))) (if (> lebar 100)
(command “line”
(polar acuan 0 (/ (distance acuan pt1) 2.0))
(polar pt3 0 (/ (distance acuan pt1) 2.0)) “”

“line”
(polar acuan (/ pi 2) (/ (distance acuan pt3) 2.0))
(polar PT1 (/ pi 2) (/ (distance acuan pt3) 2.0)) “”
)
)
(princ)
)
[/sourcecode]

jalankan Command BENTUK, untuk 3 pilihan lebar jarak seperti diatas. maka gambar yang dihasilkan akan memenuhi kriteria bentuk
1. lebar < 100, maka kotak akan disilang
2. lebar = 100, ditengah kotak ada lingkaran
3. lebar > 100, ada tanda plus ditengah kotak

5.    Calculator

Sebuah Lisp, juga bisa dimanfaatkan untuk kalkulator, bahkan untuk penghitungan matematis yang rumit sekalipun. sebagai contoh sederhana, dari sebuah tangga dengan tinggi lantai tertentu dan jumlah anak tangga tertentu juga

[sourcecode language=’cpp’]
(defun c:tangga ()
(setq level (getdist “\n Tinggi Lantai : “);;; dengan getdist bukan getreal
upstair (getint “\n Jumlah anak tangga : “)
up (/ level upstair)
)
(princ up)
(princ)
)
[/sourcecode]

UP, yang merupakan tinggi anak tangga bisa dihitung dengan fungsi pembagian

Getdist, meminta masukan jarak dari bilangan real.
dengan getreal, masukan hanya bisa di input dengan mengetikan saja.
tetapi dengan getdist, masukan bisa diberikan dengan mengetikan angka jarak atau klik klik (2 kali klik) mouse  untuk terbaca sebagai masukan jarak antara 2 titik klik mouse tadi.

lebih lengkap mengenai fungsi matematis bisa dilihat di HELP

saya menyertakan attachment yang terbagi menjadi 2 dalam artikel ini, subroutine.lsp dan artikel1.lsp. Load 2 file ini dan ada beberapa command baru.
1.    kotak
2.    kotak1
3.    jendela
4.    bentuk
5.    tangga

salam,
-ast-

—————————

Profil Penulis:

Saya Arus, tahun 1997 – 2000 (Singapore) dan th 2003 – 2005 (Sydney) saya banyak menulis tentang AutoLISP dan pekerjaan 3D. pada masa itu saya harus membuat standar untuk berbagai parameter. Banyaknya konsultan yang memberikan masukan data gambar, dengan berbagai karakter dan kebiasaan serta software yang beragamlah yang menempa saya untuk mendefinisikan data agar mudah diterjemahkan dan di modifikasi di AutoCAD.