Senin, 27 November 2023

Belajar Autolisp dengan Praktek Langsung - 10. Menggambar Berbagai Ukuran Kertas

Program di upgrade agar bisa menggambar berbagai ukuran kertas, misal :

Ukuran kertas A4 : 297mm x 210mm

Ukuran kertas A3 : 420mm x 297mm

Ukuran kertas A2 : 594mm x 420mm

Ukuran kertas A1 : 840mm x 594mm

Jika kecepatan kerja yang diinginkan, program ini lebih baik dibuat untuk masing kertas-kertas, misalnya seperti ini :

(defun c:ka4( / oldos panjang lebar ttk1 ttk2 ttk3 ttk4 koorx koory) 
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq panjang 297) 
(setq lebar 210) 
(setq ttk1 (getpoint "Tentukan titik sisip kertas...")) 
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1))) 
(setq koorx (+ koorx panjang)) 
(setq ttk2 (list koorx koory)) 
(setq koory (+ koory lebar)) 
(setq ttk3 (list koorx koory)) 
(setq koorx (- koorx panjang)) 
(setq ttk4 (list koorx koory)) 
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "OSMODE" oldos) 
(princ) 
)

(defun c:ka3( / oldos panjang lebar ttk1 ttk2 ttk3 ttk4 koorx koory) 
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq panjang 420) 
(setq lebar 297) 
(setq ttk1 (getpoint "Tentukan titik sisip kertas...")) 
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1))) 
(setq koorx (+ koorx panjang)) 
(setq ttk2 (list koorx koory)) 
(setq koory (+ koory lebar)) 
(setq ttk3 (list koorx koory)) 
(setq koorx (- koorx panjang)) 
(setq ttk4 (list koorx koory)) 
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "OSMODE" oldos) 
(princ) 
)
(defun c:ka2( / oldos panjang lebar ttk1 ttk2 ttk3 ttk4 koorx koory) 
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq panjang 594) 
(setq lebar 420) 
(setq ttk1 (getpoint "Tentukan titik sisip kertas...")) 
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1))) 
(setq koorx (+ koorx panjang)) 
(setq ttk2 (list koorx koory)) 
(setq koory (+ koory lebar)) 
(setq ttk3 (list koorx koory)) 
(setq koorx (- koorx panjang)) 
(setq ttk4 (list koorx koory)) 
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "OSMODE" oldos) 
(princ) 
)
(defun c:ka1( / oldos panjang lebar ttk1 ttk2 ttk3 ttk4 koorx koory) 
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq panjang 840) 
(setq lebar 594) 
(setq ttk1 (getpoint "Tentukan titik sisip kertas...")) 
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1))) 
(setq koorx (+ koorx panjang)) 
(setq ttk2 (list koorx koory)) 
(setq koory (+ koory lebar)) 
(setq ttk3 (list koorx koory)) 
(setq koorx (- koorx panjang)) 
(setq ttk4 (list koorx koory)) 
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "OSMODE" oldos) 
(princ) 
)

Biasanya untuk perintah-perintah yang jarang digunakan jika harus mengingat banyak perintah membuat tidak nyaman, dan secara memori komputer tidak efisien (sekarang mungkin tidak masalah ya, karena program Autolsip dibanding RAM komputer jaman sekarang).

Disini akan dibuat program alternatif untuk membuat keempat program di atas menjadi satu perintah aja, nanti didalamnya pengguna diminta memilih opsi ukuran kertas yang digunakan.

Fungsi-fungsi tambahan yang akan digunakan adalah:

Fungsi Initget

Fungsi ini menentukan kata kunci yang tersedia (fungsi  (entsel) (getangle) (getcorner) (getdist) (getint) (getkword) (getorient) (getpoint) (getreal) (getstring) (nentsel) (nentselp) ) untuk input pengguna berikutnya.

format fungsi initget  pada BricsCAD V22 - Developer Reference :

(initget  [ bitflags ]  [ keywords ] )

bitflags : (opsional) kombinasi nilai bit untuk mengontrol perilaku;
bit 0 = 1 : jika disetel, tidak mengizinkan input kosong
bit 1 = 2 : jika disetel, tidak mengizinkan nilai 0 sebagai input
bit 2 = 4 : jika disetel, tidak mengizinkan nilai negatif sebagai input
bit 3 = 8 : jika disetel, titik di luar batas gambar diterima (abaikan pengaturan LIMCHECK)
bit 5 = 32 : jika disetel, menggunakan garis karet pada kursor mouse
bit 6 = 64 : jika disetel, hanya titik 2D yang dikembalikan (koordinat Z diabaikan)
bit 7 = 128 : jika disetel, memungkinkan input sewenang-wenang (bit 0 diabaikan, input kosong mengembalikan string kosong)
bit 8 = 256 : jika disetel, masukan jarak diprioritaskan daripada masukan sembarang
bit 9 = 512 : jika disetel, (getpoint) dan (getcorner) akan menggunakan UCS dinamis sementara, ketika mouse mengarahkan suatu entitas
bit 10 = 1024 : jika disetel, ORTHO, POLAR, Z-SNAPPING, dan tracking dinonaktifkan/diabaikan

keywords : (opsional) string kata kunci dalam format "Panjang Lebar..." atau "Panjang Lebar _ Length Width"; 

Fungsi Getkword

Fungsi ini menjeda input pengguna untuk menentukan string kata kunci, seperti yang ditentukan oleh panggilan sebelumnya (initget) ; mengembalikan string kata kunci lengkap atau NIL.

Format fungsi initget  pada BricsCAD V22 - Developer Reference :

(getkword  [ prompt ] )

Prompt - (opsional) string prompt yang akan ditampilkan; jika diabaikan, tidak ada string prompt yang ditampilkan

(defun c:kertas( / oldos pilih panjang lebar ttk1 ttk2 ttk3 ttk4 koorx koory)

(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(initget "1 2 3 4 _A1 A2 A3 A4")
(setq pilih (getkword "\nPilih 1 untuk A1, 2 untuk A2 dst (1.A1/2.A2/3.A3/4.A4): "))
(setq ttk1 (getpoint "Tentukan titik sisip kertas..."))
(cond
((= pilih "A1")
(progn
(setq panjang 840)
(setq lebar 594)
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1)))
(setq koorx (+ koorx panjang))
(setq ttk2 (list koorx koory))
(setq koory (+ koory lebar))
(setq ttk3 (list koorx koory))
(setq koorx (- koorx panjang))
(setq ttk4 (list koorx koory))
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
))
((= pilih "A2")
(progn
(setq panjang 594)
(setq lebar 420)
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1)))
(setq koorx (+ koorx panjang))
(setq ttk2 (list koorx koory))
(setq koory (+ koory lebar))
(setq ttk3 (list koorx koory))
(setq koorx (- koorx panjang))
(setq ttk4 (list koorx koory))
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
))
((= pilih "A3")
(progn
(setq panjang 420)
(setq lebar 297)
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1)))
(setq koorx (+ koorx panjang))
(setq ttk2 (list koorx koory))
(setq koory (+ koory lebar))
(setq ttk3 (list koorx koory))
(setq koorx (- koorx panjang))
(setq ttk4 (list koorx koory))
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
))
((= pilih "A4")
(progn
(setq panjang 297)
(setq lebar 210)
(setq koorx (car ttk1)) (setq koory (car (cdr ttk1)))
(setq koorx (+ koorx panjang))
(setq ttk2 (list koorx koory))
(setq koory (+ koory lebar))
(setq ttk3 (list koorx koory))
(setq koorx (- koorx panjang))
(setq ttk4 (list koorx koory))
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
))
) ;; end cond
(setvar "OSMODE" oldos)
(princ)
)

Tentu saja program ini bisa dibuat lebih ringkas dengan membuat fungsi, dengan parameter panjang dan lebar. Silahkan dicoba sendiri dan kalau ada kesulitan silahkan dishare saja.

---000---

Minggu, 22 Oktober 2023

Belajar Autolisp dengan Praktek Langsung - 9. Menggambar Ukuran Kertas A4 dengan Manipulasi List (Fungsi List, Car, Cdr)

Selain menggunakan polar, cara lainnya yaitu dengan manipulasi list, dengan fungsi list, car dan cdr. Selain fungsi tersebut terdapat juga fungsi cons dan append untuk manipulasi list.

Fungsi List berfungsi untuk membuat data list

format fungsi list pada BricsCAD V22 - Developer Reference :

(list  [ item [ item [ item ... ]]] )

- item : apapun berupa list atau atom list 

contoh penggunaan 

(list 1 2 3 4) -> (1 2 3 4)

Fungsi car berfungsi untuk mendapatkan elemen list yang pertama

format fungsi car pada BricsCAD V22 - Developer Reference :

(car  lst)

- lst : list atau dottetpair, bisa juga NIL (list kosong / ()), bingung? lain kali dibahas ya. sementara list dulu.

contoh penggunaan 

(car '(1 2 3 4)) -> 1

Fungsi cdr berfungsi untuk mendapatkan list tanpa elemen pertama.

format fungsi cdr pada BricsCAD V22 - Developer Reference :

(cdr  lst)

contoh penggunaan 

(cdr '(1 2 3 4)) -> (2 3 4)


(defun c:ka4( / panjang lebar ttk1 ttk2 ttk3 ttk4 koorx koory)
(setq panjang 297)
(setq lebar 210)
(setq ttk1 (getpoint "Tentukan titik sisip kertas..."))
(setq koorx (car ttk1))
(setq koory (car (cdr ttk1)))
(setq koorx (+ koorx panjang))
(setq ttk2 (list koorx koory))
(setq koory (+ koory lebar))
(setq ttk3 (list koorx koory))
(setq koorx (- koorx panjang))
(setq ttk4 (list koorx koory))
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(princ)
)


---000---

Jumat, 13 Oktober 2023

Belajar Autolisp dengan Praktek Langsung - 8. Menggambar Ukuran Kertas A4 dengan Perintah Fungsi Command secara Interaktif dengan Fungsi Polar

Menggambar Ukuran Kertas A4 dengan Perintah Fungsi Command 

Interaktif disini maksudnya saat program berjalan pengguna bisa berinteraksi dengan Bricscad/ Autocad. Misal titik awal penggambaran kertasnya adalah diserahkan pengguna, yaitu dengan memilih titik pada layar. 

Untuk memilih titik pada layar fungsi yang digunakan adalah fungsi getpoint

format fungsi getpoint  pada BricsCAD V22 - Developer Reference :

(getpoint  [ refPoint ]  [ prompt ] )

refPoint : (opsional) titik acuan 2d/3d; jika ditentukan, digunakan sebagai titik awal rubberband; jika dihilangkan, '(0 0) digunakan

prompt : (opsional) teks pada command prompt yang akan ditampilkan; jika dihilangkan, prompt standar akan ditampilkan

fungsi getpoint ini akan mengembalikan list berupa koordinat 3D (x y z), setelah data titik awal diperoleh maka data titik-titik berikutnya bisa diperoleh dari ukuran panjang dan lebar ukuran kertas. Fungsi yang paling banyak digunakan (mungkin karena kemudahannya) adalah polar.

Fungsi Polar digunakan untuk mencari titik terhadap suatu titik lain dengan argument titik, sudut dan jarak.

format fungsi polar  pada BricsCAD V22 - Developer Reference :

(polar point angle distance)

point : titik acuan

angle : sudut, dalam radian

distance : jarak

pada fungsi polar satuan sudut tidak menggunakan derajat melain radian, dimana pi rad = 180 derajat.

Untuk kemudahannya fungsi berikut adalah fungsi untuk mengubah dari derajat ke radian:

(defun d2r (derajat) (* pi (/ derajat 180.0)))

berikut kodenya

(defun c:ka4( / oldos d2r panjang lebar ttk1 ttk2 ttk3 ttk4)
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(defun d2r (derajat) (* pi (/ derajat 180.0)))
(setq panjang 297)
(setq lebar 210)
(setq ttk1 (getpoint "Tentukan titik sisip kertas..."))
(setq ttk2 (polar ttk1 (d2r 0) panjang))
(setq ttk3 (polar ttk2 (d2r 90) lebar))
(setq ttk4 (polar ttk3 (d2r 180) panjang))
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "OSMODE" oldos)
(princ)
)


catatan:

- (setq ttk4 (polar ttk3 (d2r 180) panjang)) bisa juga diganti dengan (setq ttk4 (polar ttk1(d2r 90) lebar))

- fungsi d2r bisa juga diletakkan diluar program, tetapi fungsi ini akan tetap ada meskipun program selesai berjalan.



Rabu, 11 Oktober 2023

Belajar Autolisp dengan Praktek Langsung - 7. Menggambar Ukuran Kertas A4 dengan Perintah Fungsi Command secara Sederhana


Menggambar Ukuran Kertas A4 dengan Perintah Fungsi Command 

Metode untuk menggambar dengan autolisp :

1. Metode "command", metode ini paling mudah digunakan. Dalam pembuatan codenya seperti menggambar dengan memasukkan perintah-perintah pada command prompt.

2. Metode "activex", metode ini menggunakan cara-cara seperti dalam visual basic application.

3. Metode "entmake", metode ini langsung dengan mengubah data base Bricscad/ Autocad

Untuk menggambar garis persegi panjang sesuai ukuran keras meskipin kelihatan sederhana, pembuatan program ini nantinya akan banyak menggunakan fungsi-fungsi yang ada di autolisp. Disini akan digunakan cara bertahap, dari yang paling mudah terlebih dahulu kemudian bertahap ke yang lebih komplek. Untuk membuat gambar dengan autolisp diperlukan pemahaman cara menggambar sesuai prosedur baku penggambaran dalam Bricscad/ Autocad. Jadi bagi para pengguna Bricscad/ Autocad yang belajarnya secara praktis silahkan baca-baca materi menggambar Autocad dari dasar (yang isinya koordinat UCS danWCS, input kooordinat secara relatif maupun absolut, perintah membuat objek/ entity dengan urutan perintah serta opsi-opsinya)

Ukuran kertas A4 : 297mm x 210mm

Fungsi Command

Fungsi command berfungsi menjalankan perintah Bricscad/ Autocad

Format fungsi command di BricsCAD V22 - Developer Reference adalah sebagai berikut : 

(command  [ item1 [ item2 ... ]] )

item1 : perintah atau opsi BricsCAD asli apa pun, atau ekspresi Lisp apa pun yang valid
item2 : perintah atau opsi BricsCAD asli apa pun, atau ekspresi Lisp apa pun yang valid

Karena fungsi command bekerja dengan berinteraksi dengan Bricscad/ Autocad maka saat menjalankan program opsi entity snap (ESNAP di Bricscad/ OSNAP di Autocad) perlu dimatikan semua. Daripada mematikan ESNAP setiap kali mau menjalankan program, maka proses mematikan/menghidupkan dilakukan didalam program. Fungsi yang digunakan adalah fungsi setvar dan getvar.

Format fungsi setvar di BricsCAD V22 - Developer Reference adalah sebagai berikut : 
(setvar sysvar value)

Format fungsi getvar di BricsCAD V22 - Developer Reference adalah sebagai berikut : 
(getvar  sysvar)

sysvar : string atau simbol, yaitu nama variabel sistem, untuk ESNAP adalah "OSMODE"
value : nilai yang akan diberikan (integer, string, double, ...), bergantung pada SystemVariable tertentu

Untuk memudahkan prosedur penggambaran titik awal penggambaran dimulai dari titik 0,0 dan untuk sekarang setiap penggambaran satu ukuran kertas akan dijalankan dengan satu perintah :

Kertas A4,
titik ke-1 : 0,0
titik ke-2 : 297,0
titik ke-3 : 297,210
titik ke-4 : 0,210

Cara 1
Cara ini langsung memasukkan koordinat sebagai teks biasa. dengan tipe objek garis/ line, dan menggunakan acuan koordinat absolut.

codenya adalah sebagai berikut :

(defun c:ka4( / oldos)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0) 
(command "line" "0,0" "297,0" "297,210" "0,210" "0,0" "")
(setvar "osmode" oldos)  
(princ))

untuk mengakhiri perintah line dengan "" yang sama dengan menekan tombol [enter]

bisa juga dengan menyimpan titik-titik tersebut kedalam sebuah variabel

 (defun c:ka4( / oldos ttk1 ttk2 ttk3 ttk4)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ttk1 "0,0"
      ttk2 "297,0"
      ttk3 "297,210"
      ttk4 "0,210")
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "osmode" oldos) 
(princ)
)

Cara 2
Cara ini langsung memasukkan koordinat sebagai teks biasa. dengan tipe objek garis/ line, dan menggunakan acuan koordinat relatif.

codenya adalah sebagai berikut :

(defun c:ka4( oldos)  
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "line" "0,0" "@297,0" "@0,210" "@-297,0" "@0,-210" "")
(setvar "osmode" oldos) 
(princ)
)

tentu saja nilai-nilai relatif ini bisa saja disimpan dalam variabel, tetapi karena sifatnya relatif mungkin penamaan variabelnya agar mudah dibaca seperti ini....

(defun c:ka4( / oldos awal kekanan297 keatas210 kekiri297 kebawah210)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0) 
(setq awal "0,0" 
     kekanan297 "@297,0" 
     keatas210 "@0,210" 
     kekiri297 "@-297,0" 
     kebawah210 "@0,-210") 
(command "line" awal kekanan297 keatas210 kekiri297 kebawah210 "")
(setvar "osmode" oldos) 
(princ) 
)

Cara 3
Cara ini dengan memasukkan koordinat sebagai data list. dengan tipe objek garis/ line.
List adalah format dasar dalam autolisp, bahkan program Autolisp sendiri adalah List. (Lisp adalah singkatan dari List Processing). Titik koordinat dalam Bricscad/Autocad dalam Autolisp bisa berupa titik 2D maupun 3D.
2D -> (x y)
3D -> (x y z)
Untuk tipe garis data titiknya boleh 2D maupun 3D.

codenya adalah sebagai berikut :

(defun c:ka4( / oldos )
(setq oldos (getvar "osmode"))
(setvar "osmode" 0) 
(command "line" '(0 0) '(297 0) '(297 210) '(0 210) '(0 0) "")
(setvar "osmode" oldos) 
(princ)
)



atau 

(defun c:ka4( / oldos ttk1 ttk2 ttk3 ttk4)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0) 
(setq ttk1 '(0 0)
          ttk2  '(297 0)
          ttk3  '(297 210)
          ttk4 '(0 210) )
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "osmode" oldos) 
(princ)
)


Selanjutnya untuk titik akan digunakan format list, karena memang nantinya fungsi-fungsi dalam Autolisp adalah memanipulasi data list.

Untuk menggambar dititik yang lain perlu dihitung lagi titik-titiknya, misal jika dimulai dari titik 150,150 codenya menjadi seperti berikut :

(defun c:ka4( / oldos ttk1 ttk2 ttk3 ttk4)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0) 
(setq ttk1 '(150 150)
          ttk2  '(447 150)
          ttk3  '(447 360)
          ttk4 '(150 360) )
(command "line" ttk1 ttk2 ttk3 ttk4 ttk1 "")
(setvar "osmode" oldos) 
(princ)
)

Pada materi kali ini sengaja dibuat dengan perintah yang sederhana dan statis, tetapi dibuat dengan banyak cara dengan harapan ada pemahaman bahwa untuk membuat program dengan hasil akhir yang sama ada banyak cara. Cara mana yang paling baik? Tentu saja tergantung......
Pada materi berikutnya program akan dibuat lebih interaktif.

Selasa, 10 Oktober 2023

Belajar Autolisp dengan Praktek Langsung - 6. Menggabung String dengan Fungsi strcat dan Konversi Data Bilangan ke String

Format fungsi strcat di BricsCAD V22 - Developer Reference adalah sebagai berikut :

(strcat [ stringA [ stringB ... ] ] )

Fungsi ini digunakan untuk menggabungkan semua string masukan yang disediakan stringA, stringB, ...


contoh 1

 (strcat "saya " "sedang " "belajar " "autolisp ")

jika kita ketikkan langsung di command prompt :


: (strcat "saya " "sedang " "belajar " "autolisp ") [enter]

"saya sedang belajar autolisp "


contoh 2

(setq a "saya ")

(setq b "sedang ") 

(setq c "belajar ")

(setq d "autolisp ")

(strcat a b c d)

jika kita ketikkan langsung di command prompt :

: (setq a "saya ") [enter]

"saya "

: (setq b "sedang ") [enter]

"sedang "

: (setq c "belajar ") [enter]

"belajar "

: (setq d "autolisp ") [enter]

"autolisp "

: (strcat a b c d) [enter]

"saya sedang belajar autolisp "


Program f2c bisa dirubah agar lebih ringkas :

(defun c:f2c ( / f)

(princ "Program untuk Konversi dari Fahrenheit ke Celcius")

(setq f (getreal "Berapa Fahrenheit : "))

(princ (strcat "Nilai Fahrenheit : " (rtos f 2 1) "\n"))

(princ (strcat "Nilai Celcius : " (rtos (+ (* (/ 9.0 5.0)  f) 32) 2 2) ))

(princ)

)


Argument fungsi strcat memerlukan jenis data/ variabel berupa deretan huruf, atau dalam pemrograman disebut dengan jenis data "string". Untuk mengubah data dari bilangan real ke data string yaitu dengan fungsi rtos.

format fungsi rtos di BricsCAD V22 - Developer Reference adalah sebagai berikut :

(rtos number [ mode [ precision ] ] )

keterangan :
  * number : bilangan yang akan diubah menjadi string
  * mode :  
       1 scientific
       2 decimal
       3 engineering
       4 architectural
       5 fractional
 * precision : jumlah  desimal yang dinginkan