(DEFUN S::STARTUP()
  (setvar "cmdecho" 0)
  (load "low.lsp")
  (c:ini)(PRINC))

(DEFUN C:Ini()
  (setvar "Osmode" 33)
  (setvar "AngDir" 1)
  (setvar "AngBase" (* pi 0.5))
  (setvar "AUnits" 1)
  (setvar "AUPrec" 4)
)

(defun C:ZE()(command "Zoom" "e"))
(defun C:ZP()(command "Zoom" "p"))
(defun C:ZV()(command "Zoom" "v"))

(defun c:oe () (command "osnap" "end"))
(defun c:oi () (command "osnap" "int"))
(defun c:oc () (command "osnap" "cen"))
(defun c:om () (command "osnap" "mid"))
(defun c:ox () (command "osnap" "end+int"))
(defun c:oy () (command "osnap" "end+int+cen"))
(defun c:oz () (command "osnap" "end+int+cen+mid"))
(defun c:o- () (command "osnap" "off"))

(defun c:2 ()
  (command "fillet" "R" "2" "" "")
  (command "fillet")
)

(defun c:3 ()
  (command "fillet" "R" "3" "" "")
  (command "fillet")
)

(defun c:4 ()
  (command "fillet" "R" "4" "" "")
  (command "fillet")
)

(defun c:5 ()
  (command "fillet" "R" "5" "" "")
  (command "fillet")
)

(defun c:6 ()
  (command "fillet" "R" "6" "" "")
  (command "fillet")
)

(defun c:7 ()
  (command "fillet" "R" "7" "" "")
  (command "fillet")
)

(defun c:8 ()
  (command "fillet" "R" "8" "" "")
  (command "fillet")
)

(defun c:9 ()
  (command "fillet" "R" "9" "" "")
  (command "fillet")
)


;;; To load Low.lsp
(defun c:Low()
  (load "low.lsp")
)


;; Copy objects to the required layer
(DEFUN C:CPLA()
  (SETQ QQj(GETSTRING"\nEnter target layer name: "))
  (SETQ Q@(SSGET))
  (COMMAND"copy"Q@"""0,0""0,0")
  (COMMAND"change"Q@"""p""la"QQj""))

;; 
(DEFUN Ql()
  (SETQ Q1(GETPOINT"\nPick relative position \n"))
  (SETVAR"lastpoint"Q1)
  (GETPOINT"\nEnter relative distance or co-ordinates "))

;;; Change Text Height
(DEFUN C:10 (/ SelSet NewTextHt NumElm Counter Elm TYPE OldTextHtList
               NewTextHtList NewElm)
  (SETQ SelSet (SSGET))
  (SETQ NewTextHt (GETDIST "\nEnter new text size "))
  (SETQ NumElm (SSLENGTH SelSet))
  (SETQ Counter 0)
  (REPEAT NumElm
    (SETQ Elm(ENTGET(SSNAME SelSet Counter)))
    (SETQ Counter(+ 1 Counter))
    (SETQ TYPE(ASSOC 0 Elm))
    (IF(="TEXT"(CDR TYPE))
      (PROGN(SETQ OldTextHtListList (ASSOC 40 Elm))
            (SETQ NewTextHtList (CONS (CAR OldTextHtListList) NewTextHt))
            (SETQ NewElm (SUBST NewTextHtList OldTextHtListList Elm))
            (ENTMOD NewElm)))))

;;; Set the layer of the picked object to be current layer
(DEFUN C:CLA(/ Q| QOj Q|j)
  (PROMPT"\nPick an entity on the target layer: ")
  (SETQ Q|(ENTSEL))
  (SETQ QOj(ENTGET(CAR Q|)))
  (SETQ Q|j(CDR(ASSOC 8 QOj)))
  (COMMAND"layer""s"Q|j""))

;;; Off the layer of the picked object
(DEFUN C:OLA(/ Q| QOj Q|j)
  (PROMPT"\nPick an entity on the target layer: ")
  (SETQ Q|(ENTSEL))
  (SETQ QOj(ENTGET(CAR Q|)))
  (SETQ Q|j(CDR(ASSOC 8 QOj)))
  (COMMAND"layer""off"Q|j""))

;;(DEFUN C:1(/ Q1 Q# Q%j Q?@ Q&)
;  (SETQ Q1(GETPOINT"\nClick end of line"))
;  (SETQ Q%j(GETREAL"\nEnter distance up in meter: "))
;  (SETQ Q?@(CADR Q1))
;  (SETQ Q?@(+ Q?@(* 10 Q%j)))
;  (SETQ Q#(LIST(CAR Q1)Q?@))
;  (SETQ Q&(GETVAR"osmode"))
;  (SETVAR"osmode"0)(COMMAND"line"Q1 Q#"")
;  (SETVAR"osmode"Q&))

;(DEFUN C:2()
;  (PRINC"This Lisp change the Text of Text\n")
;  (SETQ Qj@"Old Ground Level")
;  (SETQ Q@@(CONS 1 Qj@))
;  (SETQ QQ@(SSGET))
;  (SETQ Ql@ 0)
;  (IF(/= QQ@ NIL)
;    (WHILE(< Ql@(SSLENGTH QQ@))
;      (SETQ Q&@(ENTGET(SSNAME QQ@ Ql@)))
;      (SETQ Q1@(ASSOC 1 Q&@))
;      (ENTMOD(SUBST Q@@ Q1@ Q&@))
;      (SETQ Ql@(+ 1 Ql@)))))

(DEFUN C:CT()
  (PRINC "This Lisp change the Text of Text\n")
  (SETQ NewText (GETSTRING T "Enter the text require: "))
  (SETQ Q@@(CONS 1 NewText))
  (SETQ QQ@(SSGET))
  (SETQ Ql@ 0)
  (IF(/= QQ@ NIL)
    (WHILE(< Ql@(SSLENGTH QQ@))
    (SETQ Q&@(ENTGET(SSNAME QQ@ Ql@)))
    (SETQ Q1@(ASSOC 1 Q&@))
    (ENTMOD(SUBST Q@@ Q1@ Q&@))
    (SETQ Ql@(+ 1 Ql@)))))

;; Change a text string to another text string, keep other attributes
(DEFUN C:CTT()
  (princ "\nGet Source Text: ")
    (setq STxt (assoc 1 (entget (car (entsel)))))
  (princ "\nGet Target Text: ")
    (setq TEnt (entget (car (entsel))))
    (setq TTxt (assoc 1 TEnt))
  (entmod (subst STxt TTxt Tent))
)

(DEFUN C:CTW(/ Q#@ Q0@ QQ@ Ql@ Q&@ Q$@)
  (PRINC"This Lisp change the width of Text\n")
  (SETQ Q#@(GETREAL"Enter new text width:  "))
  (SETQ Q0@(CONS 41 Q#@))
  (SETQ QQ@(SSGET))
  (SETQ Ql@ 0)
  (IF(/= QQ@ NIL)
    (WHILE(< Ql@(SSLENGTH QQ@))
      (SETQ Q&@(ENTGET(SSNAME QQ@ Ql@)))
      (SETQ Q$@(ASSOC 41 Q&@))
      (ENTMOD(SUBST Q0@ Q$@ Q&@))
      (SETQ Ql@(+ 1 Ql@)))))

(DEFUN QO@(Q|@ INT / Q%@ Q?Q QjQ)

(DEFUN QjQ(Q@Q QQQ / QlQ)
  (IF(>(SETQ QlQ(REM QQQ Q@Q))9)
  (CHR(+ 55 QlQ))
  (ITOA QlQ)))
  (SETQ Q%@(QjQ Q|@ INT)Q?Q(/ INT Q|@))
  (WHILE(>= Q?Q Q|@)
    (SETQ Q%@(STRCAT(QjQ Q|@ Q?Q)Q&Q))
    (SETQ Q?Q(/ Q?Q Q|@)))
    (STRCAT(QjQ Q|@ Q?Q)Q%@))

(DEFUN C:ASCII(/ Q1Q Q#Q Q0Q Q$Q QOQ Q|Q Q%Q)
  (INITGET"Yes")
  (SETQ Q1Q(GETSTRING"\nWriting to ASCII.TXT, continue? <Y>: "))
  (IF(OR(= Q1Q"Yes")(= Q1Q""))
  (PROGN(SETQ Q#Q(OPEN"ascii.txt""w")Q1Q 1 Q$Q 0 Q0Q 0)
        (PRINC"\n \n CHAR   DEC  OCT  HEX \n")
        (PRINC"\n \n CHAR   DEC  OCT  HEX \n"Q#Q)
        (WHILE Q1Q(SETQ QOQ(STRCAT"  "(ITOA Q$Q))Q|Q(QO@ 8 Q$Q)Q%Q(QO@ 16 Q$Q))(SETQ QOQ(SUBSTR QOQ(-(STRLEN QOQ)2)3))(IF(<(STRLEN Q|Q)3)(SETQ Q|Q(STRCAT"0"Q|Q)))(PRINC(STRCAT"\n "(CHR Q$Q)"      "QOQ"  "Q|Q"  "Q%Q))(PRINC(STRCAT"\n "(CHR Q$Q)"      "QOQ"  "Q|Q"  "Q%Q)Q#Q)(COND((= Q$Q 255)(SETQ Q1Q NIL))((= Q0Q 20)(SETQ QlQ(GETSTRING"\n \nPress 'X' to eXit or any key to continue: "))(IF(=(STRCASE QlQ)"X")(SETQ Q1Q NIL)(PROGN(SETQ Q0Q 0)(PRINC"\n \nCHAR   DEC  OCT  HEX \n")))))(SETQ Q0Q(1+ Q0Q)Q$Q(1+ Q$Q)))(CLOSE Q#Q)(SETQ Q#Q NIL)))(PRINC))

(defun c:sgap ()
  (setq *gap (getreal "\nEnter gap require: "))
)

;; Set the unit of increment
(defun c:sinc()
  (setq *inc (getreal "\nEnter unit of increment: "))
)

(defun C:Scx()
  (setq Pt (getpoint "\nBasePoint?: "))
  (setq SS1 (ssget ))
  (command "Scale" SS1 "" pt 0.5 "" "")
)

;; Move entity horizontal or vertically
(defun C:MHV( / )
  (setq Test T)
  (if (= *inc nil) (c:sinc))
  (prompt "\nSelect entity to move incrementally: ")
  (setq Ntt (entsel))
  (while Test
     (prompt "\nPress Arrow key to move entity selected...")
     (setq @key (cadr (grread nil 2)))
     (cond
       ((= @key -4) (setq txt (strcat "0," (rtos *inc)))     )
       ((= @key -5) (setq txt (strcat "0,-" (rtos *inc)))    )
       ((= @key -6) (setq txt (strcat "-" (rtos *inc) ",0")) )
       ((= @key -7) (setq txt (strcat (rtos *inc) ",0"))     )
       ((= Test T) (setq Test nil)) )
     (if Test
       (command "move" ntt "" txt "")) )
)

;; Move text incrementally
(defun C:Mx( / )
  (setq Test T)
  (if (= *inc nil) (c:sinc))
  (prompt "\nSelect entity to move incrementally: ")
  (setq Ntt (entsel))
  (setq TxtRot (cdr (assoc  50 (entget (car Ntt)))))
  (while Test
     (prompt "\nPress Arrow key to move entity selected...")
     (setq @key (cadr (grread nil 2)))
     (cond
       ((= @key -4)
          (setq @lat (*  1 (* *inc (cos TxtRot))))
          (setq @dip (* -1 (* *inc (sin TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= @key -5)
          (setq @lat (* -1 (* *inc (cos TxtRot))))
          (setq @dip (*  1 (* *inc (sin TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= @key -6)
          (setq @lat (* -1 (* *inc (sin TxtRot))))
          (setq @dip (* -1 (* *inc (cos TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= @key -7)
          (setq @lat (*  1 (* *inc (sin TxtRot))))
          (setq @dip (*  1 (* *inc (cos TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= Test T) (setq Test nil)) )
     (if Test
       (command "move" ntt "" txt "")) )
)

;;; Text below Line *gap unit
(defun C:L2 ( / )
  (if (= *gap nil) (c:sgap))
  (setq nTName (car (entsel "\nClick Text: ")))
  (setq entText (entget nTName))
  (setq mpt (osnap (getpoint "\nClick on line: ") "mid"))
    (setq mpt (list (car mpt) (- (cadr mpt) *gap) (caddr mpt)))
  (setq entText (subst (cons 11 mpt) (assoc 11 entText) entText))
  (setq entText (subst (cons '72 1) (assoc 72 entText) entText))
  (setq entText (subst (cons '73 3) (assoc 73 entText) entText))
  (setq entText (entmod entText))
)

;;; Text on line *gap unit
(defun C:L8 ( / )
  (if (= *gap nil) (c:sgap))
  (setq nTName (car (entsel "\nClick Text: ")))
  (setq entText (entget nTName))
  (setq mpt (osnap (getpoint "\nClick on line: ") "mid"))
    (setq mpt (list (car mpt) (+ (cadr mpt) *gap) (caddr mpt)))
  (setq entText (subst (cons 11 mpt) (assoc 11 entText) entText))
  (setq entText (subst (cons '72 1) (assoc 72 entText) entText))
  (setq entText (subst (cons '73 0) (assoc 73 entText) entText))
  (setq entText (entmod entText))
)

;;; Text on left side of the line *gap unit
(defun C:L4 ( / )
  (if (= *gap nil) (c:sgap))
  (setq nTName (car (entsel "\nClick Text: ")))
  (setq entText (entget nTName))
  (setq mpt (osnap (getpoint "\nClick on line: ") "mid"))
    (setq mpt (list (- (car mpt) *gap) (cadr mpt) (caddr mpt)))
  (setq entText (subst (cons 11 mpt) (assoc 11 entText) entText))
  (setq entText (subst (cons '72 2) (assoc 72 entText) entText))
  (setq entText (subst (cons '73 2) (assoc 73 entText) entText))
  (setq entText (entmod entText))
)

;;; Text on right side of the line *gap unit
(defun C:L6 ( / )
  (if (= *gap nil) (c:sgap))
  (setq nTName (car (entsel "\nClick Text: ")))
  (setq entText (entget nTName))
  (setq mpt (osnap (getpoint "\nClick on line: ") "mid"))
    (setq mpt (list (+ (car mpt) *gap) (cadr mpt) (caddr mpt)))
  (setq entText (subst (cons 11 mpt) (assoc 11 entText) entText))
  (setq entText (subst (cons '72 0) (assoc 72 entText) entText))
  (setq entText (subst (cons '73 2) (assoc 73 entText) entText))
  (setq entText (entmod entText))
)

;;; Add Ki at the back of the text
(defun C:Ki ( / )
  (prompt "\nClick on the text to add Ki at the back: ")
  (setq @TxtNtt (entsel))
  (setq @TxtList (entget (car @TxtNtt)))
  (setq @OldTxt (assoc 1 @TxtList))
  (setq @NewTxt (cons 1 (strcat (cdr @OldTxt) " KI")))
  (entmod (subst @NewTxt @OldTxt @TxtList))
)

;;; Add IL at the back of the text
(defun C:IL ( / )
  (prompt "\nClick on the text to add IL at the back: ")
  (setq @TxtNtt (entsel))
  (setq @TxtList (entget (car @TxtNtt)))
  (setq @OldTxt (assoc 1 @TxtList))
  (setq @NewTxt (cons 1 (strcat (cdr @OldTxt) "IL")))
  (entmod (subst @NewTxt @OldTxt @TxtList))
)

;;; Add m2 at the back of the text
(defun C:m2 ( / )
  (prompt "\nClick on the text to add m2 at the back: ")
  (setq Ss1 (ssget))
  (setq NumElm (SSLENGTH Ss1))
  (SETQ Counter 0)
  (REPEAT NumElm
    (setq @TxtList (entget (ssname ss1 counter)))
    (setq @OldTxt (assoc 1 @TxtList))
    (setq @NewTxt (cons 1 (strcat (cdr @OldTxt) "[2]")))
    (entmod (subst @NewTxt @OldTxt @TxtList))
    (setq Counter (+ Counter 1)))
)

;;; Add Jum at the back of the text
(defun C:Jum ( / )
  (prompt "\nClick on the text to add Jum at the back: ")
  (setq @TxtNtt (entsel))
  (setq @TxtList (entget (car @TxtNtt)))
  (setq @OldTxt (assoc 1 @TxtList))
  (setq @NewTxt (cons 1 (strcat (cdr @OldTxt) " Jum")))
  (entmod (subst @NewTxt @OldTxt @TxtList))
)

;;; Dump to layer H
(defun C:dx ( / ntt)
  (setq ntt (ssget))
  (command "chprop" ntt "" "la" "Hide" "")
  (command)
)

;;; Change the layer of an object to other layer by clicking the target layer
;;; object
(defun C:Coy( / ntt lyr)
  (PROMPT"\nClick an entity which layer is to be changed: ")
  (setq ntt (ssget))
  (PROMPT"\nClick the object which is in the target layer: ")
  (setq lyr (cdr (assoc 8 (entget (car (entsel))))))
  (command "chprop" ntt "" "la" lyr "")
  (command)
)

;;; Input shape of U-Drain on two polyline
;;(defun C:Dr()
;;  (setq Pt1 (getpoint "\nFirst Point: "))
;;  (setq Pt2 (getpoint "\nSecond Point: "))
;;  (setq Pt3 (getpoint "\nThird Point: "))
;;  (setq Pt4 (list (+ 1 (car Pt1)) (+ 0.6 (cadr Pt2))))
;;  (setq Pt5 (list (- (car Pt3) 1) (+ 0.6 (cadr Pt2))))
;;  (PROMPT"\nClick the First Polyline: ")
;;  (setq Pline1 (entsel))
;;  (PROMPT"\nClick the Second Polyline: ")
;;  (setq Pline2 (entsel))
;;  (command "Pedit" Pline1 "e" "i" Pt4 "x" "x")
;;  (command "Pedit" Pline2 "e" "i" Pt5 "x" "x")
;;  (command)
;;)

;;; Change the text to "Tepi Parit Konkrit"
(DEFUN C:TPC(/ Txt NewTxtAssoc SS1 Count Ntt OldTxtAssoc)
  (SETQ Txt "Tepi Parit Konkrit")
  (SETQ NewTxtAssoc (CONS 1 Txt))
  (SETQ SS1 (SSGET))
  (SETQ Count 0)
  (IF (/= SS1 NIL)
    (WHILE(< Count (SSLENGTH SS1))
    (SETQ Ntt (ENTGET (SSNAME SS1 Count)))
    (SETQ OldTxtAssoc (ASSOC 1 Ntt))
    (ENTMOD (SUBST NewTxtAssoc OldTxtAssoc Ntt))
    (SETQ Count (+ 1 Count)))))

;;; Input Bearing and distance
;;; This method is better because it work for what ever North point direction
;;; default is meter, l for link, f for feet, c for chain
(defun C:BgDt()
  (setq OSnap "osmode")
  (setq Degree "" Minute "" Second "" Counter 1 SecTest nil MinTest nil)
  (C:OX)
  (setvar "lastpoint" (getpoint "\nGet Start point: "))
  (C:O-)
  (setq Bg (getreal "\nInput Bearing in ddd.mmss format: "))
  (setq Bg (rtos Bg 2 4))
  (while (/= Bg "")
  (if (= Bg "") (exit))
  (setq Dt (getstring "\nInput Distance in 123.456 format: "))
  (Repeat (strlen Bg)
    (setq Txt (substr Bg Counter 1))
    (setq Counter (+ Counter 1))
    (if (= SecTest T)
      (setq Second (strcat Second Txt))
      (progn
         (if (= MinTest T)
           (progn (setq Minute (strcat Minute Txt))
                  (setq MinCount (+ MinCount 1))
                  (if (= MinCount 2) (setq SecTest T)))
           (progn
             (if (= Txt ".")
               (progn (setq MinTest T) (setq MinCount 0))
               (setq Degree (strcat Degree Txt))))))
      )
  ) ;; End Repeat
  (if (= Second "") (setq Second "0"))
  (if (= Minute "") (setq Minute "0"))
  (if (= Degree "") (setq Degree "0"))
  (setq Bgx (strcat Degree "D" Minute "'" Second "\""))
  (setq Trav (strcat "@" Dt "<" Bgx))
  (command "line" (getvar "lastpoint") trav "" "")
  (setq SecTest nil MinTest nil Degree "" Minute "" Second "" Counter 1)
  (setq Bg (getstring "\nInput Bearing in ddd.mmss format: "))
  ) ;; End while
  (setvar "osmode" osnap)
)

(defun c:cw()
  (setq ss1 (ssget))
  (command "chprop" ss1 "" "c" "w" "")
)

(defun c:cy()
  (setq ss1 (ssget))
  (command "chprop" ss1 "" "c" "y" "")
)

(defun c:cg()
  (setq ss1 (ssget))
  (command "chprop" ss1 "" "c" "g" "")
)

(defun c:cb()
  (setq ss1 (ssget))
  (command "chprop" ss1 "" "c" "b" "")
)

;; Write to file
(defun C:WFile()
   (setq ff (open "opoint.prn" "w"))
   (setq ss1 (ssget))
   (setq count 0)
   (repeat (sslength ss1)
     (setq ntt (entget (ssname ss1 count)))
     (setq ntt10 (cdr (assoc 10 ntt)))
     (setq ntt11 (cdr (assoc 11 ntt)))
     (print ntt10 ff)
     (print ntt11 ff)
     (setq count (+ 1 count))
   )
   (close ff)
)

;; Break a string to two part at a given character EXCLUSIVE
;; Example (c:BstrE " 123" "1") --> " " and "123"
(defun C:BStrE(Str1 Char1 / Test)
   (setq Test T Count 1)
   (while Test
     (setq Char2 (substr Str1 Count 1))
     (if (= Char2 Char1) (setq Test nil) (setq Count (+ 1 Count)))
   )
   (setq LStr (substr Str1 1 (- Count 1)))
   (setq RStr (substr Str1 Count))
)

;; Break a string to two part at a given character INCLUSIVE
;; Example (c:BstrI " 123" "1") --> " 1" and "23"
(defun C:BStrI(Str1 Char1 / Test)
   (setq Test T Count 1)
   (while Test
     (setq Char2 (substr Str1 Count 1))
     (if (= Char2 Char1) (setq Test nil) (setq Count (+ 1 Count)))
   )
   (setq LStr (substr Str1 1 Count))
   (setq RStr (substr Str1 (+ Count 1)))
)

;; Read File of string to convert it to List and insert circle and strim line
;; inside
(defun c:RFile( / fin temp CRd Strin PtX PtY CPt CLE UR DR DL UL)
  (setq fin (open "ipoint.prn" "r"))
  (setq temp "" CRd 1.584)
  (while (setq StrIn (read-line fin))
    (if (/= Temp StrIn)
      (progn
        (c:BStrI StrIn "(")
        (c:BStrI RStr " ")
        (setq PtX (atof LStr))
        (c:BStrI RStr " ")
        (setq PtY (atof LStr))
        (setq CPt (list PtX PtY 0.0))
          (command "Circle" CPt CRd)
          (setq Cle (entlast))
          (setq UR (polar CPt 0.785398163 (- CRd (* CRd 0.3))))
          (setq DR (polar CPt 2.35619449  (- CRd (* CRd 0.3))))
          (setq DL (polar CPt 3.926990817 (- CRd (* CRd 0.3))))
          (setq UL (polar CPt 4.71238898  (- CRd (* CRd 0.3))))
          (setvar "osmode" 0)
          (command "Trim" Cle "" "f" UR DR DL UL UR "" "") 
        (setq Temp StrIn)))
  )
  (close fin)
)

;;; Get Lines only
(defun C:glo()
  (setq ssln (ssget '((0 . "LINE")) ))
)

;;; Get Circles only
(defun C:gco()
  (setq sscc (ssget '((0 . "CIRCLE")) ))
)

;;; Get Texts only
(defun C:gto()
  (setq sstxt (ssget '((0 . "TEXT")) ))
)

;;; Erase Texts only
(defun C:eto()
  (setq sstxt (ssget '((0 . "TEXT")) ))
  (command "erase" "p" "")
)



;;; Area text setting
(defun c:axs()
  (setq TAng (getangle "\nText Rotation Angle: "))
  (setq TAng (+ (/ pi 2) TAng))
  (if (> TAng (* PI 2)) (setq TAng (- TAng (* PI 2))) )
)

;;; Compute Area by AREA command and use Ax to insert the text of Area
(defun C:AX()
  ;;(command "Erase" (entlast))
  (setq pt (getpoint "\nClick for insert point: "))
  (setq keluasan (strcat (rtos (getvar "area") 2 0) "m[2]"))
  (setq elist (list 
       (cons 0  "TEXT")                         ;; Entity Type
       (list 10 (car pt) (cadr pt) (caddr pt))  ;; Insert Point
       (cons 40 (getvar "TextSize"))            ;; Text Height
       (cons 41 0.857)                          ;; Text Width
       (cons 1 keluasan)                        ;; Text Text
       (cons 50  TAng)                          ;; Text Rotation
       (cons 7  (getvar "TextStyle"))           ;; Text Style
       (cons 8  "Area")                         ;; Text Layer
       (cons 72  0)                             ;; Left Justify
       (cons 73  0)
       ))
  (entmake elist)
)

(defun C:Pre() (load "Precomp.lsp"))
(DEFUN C:CSCS() (LOAD "CSCS.LSP"))
(DEFUN C:CHTEXT() (LOAD "CHTEXT.LSP"))
(Defun c:lsoft() (Load "Cps.lsp"))


;; Copy text up or down from the line
(defun C:Cx( / Test Cinc Ntt TxtRot)
  (setq Test T)
  (setq Cinc 3.275)  ;; 1 : 750
  ;; (setq Cinc 2.0357) ;; 1 : 500
  ;; (setq Cinc 0.81)      ;; 1 : 200 
  (while (setq Ntt (entsel "\nSelect entity to copy up or down: ")) 
    (command "copy" Ntt "" "0,0" "")
    (setq TxtRot (cdr (assoc  50 (entget (car Ntt)))))
    (prompt "\nPress Arrow key to move entity selected...")
    (while Test
      (setq @key (cadr (grread nil 2)))
      (cond
        ((= @key -4)
          (setq @lat (*  1 (* Cinc (cos TxtRot))))
          (setq @dip (* -1 (* Cinc (sin TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
        ((= @key -5)
          (setq @lat (* -1 (* Cinc (cos TxtRot))))
          (setq @dip (*  1 (* Cinc (sin TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
        ((= @key -6)
          (setq @lat (* -1 (* Cinc (sin TxtRot))))
          (setq @dip (* -1 (* Cinc (cos TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
        ((= @key -7)
          (setq @lat (*  1 (* Cinc (sin TxtRot))))
          (setq @dip (*  1 (* Cinc (cos TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) ))
        (setq Test nil))
    (command "move" Ntt "" txt "")
    (setq Test T)
  )
)

;; Move text up or down from the line
(defun C:Mv( / Test MvInc Ntt TxtRot)
  (setq Test T)
  (setq MvInc 3.275)  ;; 1 : 750
  ;; (setq MvInc 2.0357) ;; 1 : 500
  ;; (setq MvInc 0.81)      ;; 1 : 200 
  (setq MvInc 2.0357)
  (prompt "\nSelect entity to move up or down: ")
  (setq Ntt (entsel))
  (setq TxtRot (cdr (assoc  50 (entget (car Ntt)))))
  (while Test
     (prompt "\nPress Arrow key to move entity selected...")
     (setq @key (cadr (grread nil 2)))
     (cond
       ((= @key -4)
          (setq @lat (*  1 (* MvInc (cos TxtRot))))
          (setq @dip (* -1 (* MvInc (sin TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= @key -5)
          (setq @lat (* -1 (* MvInc (cos TxtRot))))
          (setq @dip (*  1 (* MvInc (sin TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= @key -6)
          (setq @lat (* -1 (* MvInc (sin TxtRot))))
          (setq @dip (* -1 (* MvInc (cos TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= @key -7)
          (setq @lat (*  1 (* MvInc (sin TxtRot))))
          (setq @dip (*  1 (* MvInc (cos TxtRot))))
          (setq txt (strcat (rtos @dip) "," (rtos @lat))) )
       ((= Test T) (setq Test nil)) )
     (if Test
       (command "move" Ntt "" txt "")) )
)

;;Compute half angle
(defun c:HAg ( / IntPt FstLn F10 F11 FAngle SndLn S10 S11 SAngle HAngle Dst)
  (setq IntPt (getpoint "Get intersection point: "))
  (princ "Get first line: ")
  (setq FstLn (entget (car (entsel))))
    (setq F10 (cdr (assoc 10 FstLn)))
    (setq F11 (cdr (assoc 11 FstLn)))
    (if (> (distance IntPt F10) (distance IntPt F11))
      (setq FAngle (angle IntPt F10))
      (setq FAngle (angle IntPt F11)))
  (princ "Get second line: ")
  (setq SndLn (entget (car (entsel))))
    (setq S10 (cdr (assoc 10 SndLn)))
    (setq S11 (cdr (assoc 11 SndLn)))
    (if (> (distance IntPt S10) (distance IntPt S11))
      (setq SAngle (angle IntPt S10))
      (setq SAngle (angle IntPt S11)))
  (setq HAngle (/ (+ FAngle SAngle) 2))
  (setq Dst (getreal "Enter distance: "))
  (setq SndPt (polar IntPt HAngle Dst))
  (command "line" IntPt SndPt "")
)

(defun ToDecD(brgdms)
      ; added on 17/12/97 stment below
      (setq brgdms (+ brgdms 0.000001))	
      (setq wbrg (fix brgdms))
      (setq ms (- brgdms wbrg))
      (setq min (* ms 100.0))
      (setq wmin (fix min))
      (setq sec (- min wmin))
      (setq sec (* sec 100.0))
      (setq sec (/ sec 60.0))
      (setq min (+ wmin sec))
      (setq min (/ min 60.0))
      (+ wbrg min)
)

(defun c:PlotL ()
  (setq pt1 (getpoint "\nReference point: "))
  (while (/= pt1 nil)
    (command "osnap" "none")
    (setq Sbg (getstring "\nEnter bearing: "))
    (while (/= Sbg "")
      (setq brgdms (atof Sbg))
      (setq brg (ToDecD brgdms))
      (setq dis (getreal "\nEnter distance: "))
      (setq brg (- 90.0 brg)) ;9/1/92 closewise from East
      (setq brg1 (/ brg 180.0))
      (setq brg2 (* brg1 pi))
      (setq pt3 (polar pt1 brg2 dis))
      (command "Line" pt1 pt3 "")
      (setq Sbg (getstring "\nEnter bearing: "))
    )
      ;(command "osnap" "cen")
      (setq pt1 (getpoint "\nReference point: "))
  )
)

(defun c:PlotT ()
    (setq pt1 (getpoint "\nStart point: "))
  (while (/= pt1 nil)
    (command "osnap" "none")
    (setq Sbg (getstring "\nEnter bearing: "))
      (setq *SBg Sbg)
      (setq *Dis 0)
    (while (/= Sbg "*")
      ;(princ "\n")
      (princ "\nEnter Distance <")
      (princ *Dis)
      (setq Dis (getreal  ">: "))
        ;; if user press Enter Key alone , let Dis = *Dis else *Dis = Dis
        (if (not Dis) (setq Dis *Dis) (setq *Dis Dis))
      ;(setq dis (getreal "\nEnter distance: "))
      (setq brgdms (atof Sbg))
      (setq brg (ToDecD brgdms))
      (setq brg (- 90.0 brg)) ;9/1/92 closewise from East
      (setq brg1 (/ brg 180.0))
      (setq brg2 (* brg1 pi))
      (setq pt3 (polar pt1 brg2 dis))
      (command "Line" pt1 pt3 "")
      (setq pt1 pt3)
      (princ "\nEnter Bearing, or * to quit <")
      (princ *Sbg)
      (setq Sbg (getstring ">: "))
        ;; if user press Enter Key alone , let Sbg = *Sbg else *Sbg = Sbg
        (if (= Sbg "") (setq Sbg *Sbg) (setq *Sbg Sbg))
      ;(setq Sbg1 (getstring "\nEnter bearing: "))
    )
      (command "osnap" "end+cen+int")
      (setq pt1 (getpoint "\nReference point: "))
  )
)

;; Rotate Text 90 degree to the clicked line
(defun c:tp( / Txt OAng Lin P10 P11 LAng TNAng NAng OK)
  (setq Txt (entget (car (entsel "\nClick Text: "))))
     (setq OAng (assoc 50 Txt))

  (setq Lin (entget (car (entsel "\nClick Line: "))))
     (setq P10 (cdr (assoc 10 Lin)))
     (setq P11 (cdr (assoc 11 Lin)))
        (setq LAng (angle P10 P11))
          (setq TNAng (- LAng (/ pi 2)))
          (setq NAng (cons 50 TNAng))
  (entmod (subst NAng OAng Txt))

  (setq OAng NAng)
  (prompt "\nAccept (Yes/No) ? ")
  (setq OK (cadr (grread nil 2)))
  (if (or (= OK 110) (= OK 78))
    (progn
      (setq NAng (cons 50 (+ PI TNAng)))
      (entmod (subst NAng OAng Txt)) ) )
)

;; Reverse Text by 180 degree
(defun c:rt(/ TO@ TOA@ TextAng TNA@)
  (setq TO@ (entsel "\nClick Text: "))
    (setq TO@ (entget (car TO@)))
      (setq TOA@ (assoc 50 TO@))
        (setq TextAng (+ PI (cdr TOA@)))
          (setq TNA@ (cons 50 TextAng))
  (entmod (subst TNA@ TOA@ TO@))          
)

;; Turn layer Hide on
(defun c:h+ ( / )
  (command "-layer" "on" "Hide" "" "")
)

;; Turn layer Hide off
(defun c:h- ( / )
  (command "-layer" "off" "Hide" "" "")
)
