Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết lisp theo yêu cầu [phần 2]

Các bài được khuyến nghị

Đang cần Lisp này. Link trên không down được bà con giúp với

May quá mình còn lưu đây:

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun c:GCM ( )

(command "undo" "be")

(if (null sochia)(setq sochia 5))

(Princ "\nHay chon doi tuong :")

(setq SS (ssget '((0 . "TEXT"))))

(setq i 0)

(setq N (sslength ss))

 

(initget "Tren Duoi")

(setq kieu (getkword "\nGach phia: Tren/ text: "))

 

(setq sochiam (dnint "\nKhoang cach line voi text bang do lon text chia "sochia))

(setq sochia sochiam)

 

(cond

((/= Kieu "Tren")

(gachduoi)

)

((= Kieu "Tren")

(gachtren)

)

)

 

(command "undo" "end")

(Princ)

)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun gachduoi ()

(while (< i N)

(setq TEXTENT (ssname SS i))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

(command "ucs" "object" textent)

(setq tbTB (textbox (list (cons -1 textent)))

ll (car tbTB)

ur (cadr tbTB)

ul (list (car ll) (cadr ur))

lr (list (car ur) (cadr ll))

)

(setq dccc (- (cadr ul) (cadr ll)))

(setq ddccc (/ dccc sochiam))

(command "line" (list (car ll)(- (cadr ll) ddccc)) (list (car ur)(- (cadr ll) ddccc)) "")

(command "ucs" "p")

(setq i (1+ i))

(setvar "osmode" luubatdiem)

)

)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun gachtren ()

(while (< i N)

(setq TEXTENT (ssname SS i))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

(command "ucs" "object" textent)

(setq tbTB (textbox (list (cons -1 textent)))

ll (car tbTB)

ur (cadr tbTB)

ul (list (car ll) (cadr ur))

lr (list (car ur) (cadr ll))

)

(setq dccc (- (cadr ul) (cadr ll)))

(setq ddccc (/ dccc sochiam))

(command "line" (list (car ll)(+ (cadr ur) ddccc)) (list (car ur)(+ (cadr ur) ddccc)) "")

(command "ucs" "p")

(setq i (1+ i))

(setvar "osmode" luubatdiem)

)

)

;---------------------------------------

(defun nstr (stri def)

(princ stri)

(princ "<")

(princ " ")

(princ def)

(princ ">")

(princ ":")

(princ " ")

);defun nstr

;--------------------

(defun nstr1 (stri)

(princ stri)

(princ "<")

(princ "Nhap vao")

(princ ">")

(princ ":")

(princ " ")

);defun nstr1

;---------------------

(defun nint (prompt def / temp)

(if def

(setq temp (getint (nstr prompt def)))

(setq def (getint (nstr1 prompt)))

);if def

(if temp

(setq def temp)

def

);if temp

);defun nint

;---------------------

(defun dnint (prompt def / temp)

(if def

(setq temp (getreal (nstr prompt def)))

(setq def (getreal (nstr1 prompt)))

);if def

(if temp

(setq def temp)

def

);if temp

);defun nint

;--------------------

(defun ndist (po prompt def / temp) ;nhan kh/cach va luu gia tri mac dinh

(if def

(setq temp (getdist po (nstr prompt def)))

(setq def (getdist po (nstr1 prompt)))

)if def

(if temp

(setq def temp)

def

);if temp

);defun ndist

;-----------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

;;;;;;;;;;;;;;;;;;;;;

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các bạn giúp mình viết 1 lisp này nhé, trong file cad có các đường line và polyline, break line va polyline tại giao điểm, xuất ra tọa độ của tất cả các điểm có trong hình (điểm đầu, cuối của các line, polyline sau khi break - xóa các điểm trùng nhau).

 

Trước đó đã có lisp tdd.lsp (xác định tọa độ các đa giác) cũng gần giống với yêu cầu trên nhưng do trình độ có hạn mình vẫn chưa thể chỉnh sửa lại cho phù hợp với yêu cầu trên ....

 

;; free lisp from cadviet.com
(defun ndt();Nhom doi tuong
(setq sn 1 list_plmoi nil list_pl nil lss nil)
(while (setq ss (ssget "x" '((0 . "lwpolyline"))))
(command "explode" ss)
)
(princ (strcat "\n Chon nhom doi tuong thu : " (itoa sn)))
(while (setq ss (ssget))
(if ss (setq lss (append lss (list ss))))
(princ (strcat "\n Chon nhom doi tuong thu : " (itoa (setq sn (1+ sn))) " hoac an Enter de ket thuc"))
)
(taobo)
)

(defun taobo ()
(setq k 0)
(while (< k (length lss))
(setq ss (nth k lss))
(setq i 0)
(while (< i (sslength ss))
(setq name (ssname ss i)
ent (entget name)
p1 (cdr (assoc 10 ent))
p2 (cdr (assoc 11 ent))
j 0
)
(while (< j (sslength ss))
(setq name1 (ssname ss j)
ent1 (entget name1)
p3 (cdr (assoc 10 ent1))
p4 (cdr (assoc 11 ent1))
giao (inters p1 p2 p3 p4 T)
)
(if (not (eq name name1))
(progn
(if (and (/= giao nil) (not (equal giao p1 0.01)) (not (equal giao p2 0.01)) 
(not (equal giao p3 0.01)) (not (equal giao p4 0.01)))
(progn
(entmake (subst (cons 11 giao) (assoc 11 ent1) ent1))
(setq lm (entlast) ss (ssadd lm ss) dk1 (sslength ss))
(entmod (subst (cons 10 giao) (assoc 10 ent1) ent1))
)
)
(if (and (/= giao nil) (or (equal giao p1 0.01) (equal giao p2 0.01)) 
(not (equal giao p3 0.01)) (not (equal giao p4 0.01)))
(progn
(entmake (subst (cons 11 giao) (assoc 11 ent1) ent1))
(setq lm (entlast) ss (ssadd lm ss) dk1 (sslength ss))
(entmod (subst (cons 10 giao) (assoc 10 ent1) ent1))
)
)
)
)
(setq j (1+ j))
)
(setq i (1+ i))
)
(command "region" ss "")
(setq ss (ssget "x" '((0 . "region"))))
(setq i 0)
(setq list_pl (ssadd))
(while (< i (sslength ss))
(setq reg (ssname ss i))
(command "explode" reg)
(setq plp (ssget "p"))
(command "pedit" "l" "" "j" plp "" "")
(setq boun (entlast))
(setq list_pl (ssadd boun list_pl))
(setq i (1+ i))
)
(locbo)
(setq k (1+ k))
)
)

(defun locbo ()
(setq i 0 list_area nil)
(while (< i (sslength list_pl))
(setq boname (ssname list_pl i))
(command "area" "o" boname)
(setq list_area (append (list (getvar "area")) list_area))
(if (and (eq (apply 'max list_area) (getvar "area")) (> (sslength list_pl) 1))
(setq delname boname))
(setq i (1+ i))
)
(command "erase" delname "")
(setq list_pl (ssdel delname list_pl) list_plmoi (append (list list_pl) list_plmoi))
)


(defun c:tdd ()
(inittdd)
(command "undo" "be")
(ndt)
(setq dlst (list (strcat "X" "\t" "Y" "\n"))
oldos (getvar "osmode")
pg (getvar "ucsorg")
file (strcat (getvar "DWGPREFIX") (substr (getvar "DWGNAME") 1 
(- (strlen (getvar "DWGNAME")) 4)) ".txt")
pw (getpoint "\n Chon goc toa do ")
ff 3;(getint "\n Nhap so chu so thap phan ")
k 0 id 1
ptlst nil
dlst1 nil
)
(setvar "osmode" 0)
(if (= pw nil) (setq pW (list 0 0 0)))
(setq h 0)
(while (< h (length list_plmoi))
(setq list_pl (nth h list_plmoi))
(setq p 0)
(while (< p (sslength list_pl))
(setq name (ssname list_pl p) 
i 0
ptlst nil
obj (vlax-ename->vla-object name)
dlst1 (append (list (strcat "hinh thu: " (rtos id 2 0))) dlst1))
(while (/= (vlax-curve-getPointAtParam obj (1+ i)) nil)
(setq p1 (vlax-curve-getPointAtParam obj i))
(setq dlst1 (append (list (strcat (rtos (- (car p1) (car pw) (car pg)) 2 ff) 
"\t"
(rtos (- (cadr p1) (cadr pw) (cadr pg)) 2 ff)
)
)
dlst1))
(setq ptlst (append (list p1) ptlst))
(setq i (1+ i))
)
(setq p (1+ p))
(setq dlst1 (append (list "\n") dlst1))
(setq dlst (append dlst1 dlst))
(setq dlst1 nil)
(setq id (1+ id))
)
(setq h (1+ h))
)
(setq dlst (reverse dlst))
(setq opw (open file "w"))
(foreach n dlst (write-line n opw))
(close opw)
(setvar "osmode" oldos)
(command "undo" "e")
(command "undo" "")
(alert (strcat "Qua trinh da hoan thanh. Toa do cac manh duoc ghi trong file: " file))
(startapp "C:\\windows\\Notepad.exe" file)
)

(defun inittdd ()
(setq 
 tdd_old_er *error*
 *error* tdderror
 )
)

(defun tdderror (errmsg)
(loitdd)
)


(defun loitdd ()
(setq *error* tdd_old_er)
(command "undo" "end")
(command "undo" "")
(princ "xay ra loi trong qua trinh thao tac")
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cái này bạn Nhập Bán kính bo có 1 lần rồi sử dụng cho các lần sau mà.

Nếu bạn thích thì đây :

(defun c:fr()
(setvar "FILLETRAD" 50)
(command "fillet" pause)
)

Bác Tue_NV ơi bác sửa lại làm sao khi dùng fr thì bo bán kính 50 nhưng khi dùng fillet thì góc đó mặc định theo cad.Tại vì dùng fr thì bo bán kính 50 nhưng khi dùng fillet thì nó lại bo theo fr.Cảm ơn bác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bác Tue_NV ơi bác sửa lại làm sao khi dùng fr thì bo bán kính 50 nhưng khi dùng fillet thì góc đó mặc định theo cad.Tại vì dùng fr thì bo bán kính 50 nhưng khi dùng fillet thì nó lại bo theo fr.Cảm ơn bác.

Mình chỉnh nhé:

 

(defun c:fr()

(setq bkflcu (getvar "filletrad"))

(setvar "FILLETRAD" 50)

(command "fillet" pause)

(while (< 0 (getvar "CMDACTIVE"))

(command pause)

)

(setvar "FILLETRAD" bkflcu)

)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình chỉnh nhé:

 

(defun c:fr()

(setq bkflcu (getvar "filletrad"))

(setvar "FILLETRAD" 50)

(command "fillet" pause)

(while (< 0 (getvar "CMDACTIVE"))

(command pause)

)

(setvar "FILLETRAD" bkflcu)

)

Cái này hay à nha, giờ em mới biết. Đây là một trong những lý do em ghét sử dụng hàm command. Thanks anh :undecided:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Thực ra chỉ cần chọn 1 nhóm text là đủ. Với mỗi phần tử trong nhóm Text được chọn đó,Lisp sẽ chọn anh text kế bên và "xử" luôn.

 

Làm theo cách của bạn Tú thì lâu, cách của bác Bình thì khá hơn vì mỗi một text phải duyệt qua toàn bộ text kế bên

và cách của Tue_NV là tốc độ nhanh nhất. :undecided:

Nhưng không thấy lisp nối text của bác TUE_NV đâu cả.Thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình đang phải làm công việc sau khi có file đo hiện trạng, nhưng đơn vi đo đạc chỉ giao file hiện trạng mà ác lại đưa về cùng một lớp. Tách lọc các số cao độ từng số thì qua lâu.

Nay mình nhờ các anh giúp LISP : làm thế nào mà lọc các text có cao độ sang 1 lớp khác có tên là Caodo

CÁM ƠN

http://www.cadviet.com/upfiles/3/hientrang_01.rar

Cái file bạn gởi không có cái text nào cả mà.

Nhưng thử dùng cái này xem sao nhé :

 
;;tach chu va so ra cac lop rieng biet
(defun c:chu_so (/ SS1 LopT LopN Count En Eg)
 (luuBHT);luu bien he thong
 (setvar "cmdecho" 0) (setvar "osmode" 0) (setvar "blipmode" 0) (setvar "orthomode" 0)
 (princ "\nChon cac chu ")
 (while (null (setq SS1 (ssget (list (cons 0 "Text"))))) (princ "\nChua chon duoc chu "))
 (if (= (setq LopT (getstring "\nNhap ten lop se chua cac chu ")) "") (setq LopT "Tamchu"))
 (if (= (setq LopN (getstring "\nNhap ten lop se chua cac so  ")) "") (setq LopN "Tamso"))
 (setq Count 0)
 (repeat (sslength SS1)
(setq En (ssname SS1 Count) Eg (entget En))
(if (numberp (distof (cdr (assoc 1 eg))))
  (setq Eg (subst (cons 8 lopN) (assoc 8 Eg) Eg))
  (setq Eg (subst (cons 8 LopT) (assoc 8 Eg) Eg)));if
(setq Count (1+ Count))
(entmod Eg));repeat
 (traBHT);tra bien he thong
(princ))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cái này hay à nha, giờ em mới biết. Đây là một trong những lý do em ghét sử dụng hàm command. Thanks anh :undecided:

Cái này mình cũng lượm trên cadviet lúc trước cũng vướng cái chổ thực trả lệnh về cho cad làm việc xong lấy lại cho lisp làm việc tiếp ghê lắm từ ngày có anh này cải tạo được mấy cái lisp củ chuối khi xưa.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình không chạy được, hay do mình sử dụng Cad2004.

Bạn viết để chạy trên cad nào ? mong đựơc chỉ giúp

Bạn bỏ 2 câu luuBHT và traBHT đi là đc. Vì 2 câu này chỉ để bảo toàn biến hệ thống mà thôi.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình xin nhờ anh giúp cho việc trích thửa ra và in theo tỉ lệ.

Trong màn hình thì setup nó là 1:1 , nếu cần in thì ta chọn theo tỉ lệ in nhu 1:500 thì chọn 1 : 0.5 , v,v...

Nhưng vẩn để tỉ lệ là 1:1 mà khi trích thửa như trên, chọn vùng để ghi và lisp yêu vầu tỉ lệ in là bao nhiêu ?

Khi đó thửa được trích ra sẻ thu hay phóng theo tỉ lệ mà ta chọn.

Như vậy ta có mẫu khung chuẩn 1:1 và thủa sẻ tăng giảm theo tỉ lệ và để phù họp theo khung.

Rất mong được anh giúp. Cám ơn

http://www.cadviet.com/upfiles/3/trich_thua_theo_ti_le.rar

Hy vọng đây là cái bạn cần :

http://www.cadviet.com/upfiles/3/lvtcu_ndait.lsphttp://www.cadviet.com/upfiles/3/ndait_extrim.lsp

Tắt bớt các lớp không cần thiết trước sau đó

Bạn chọn vùng cần đặt thửa sau khi trích

Rồi chọn vùng trên BĐGT (Dùng kèm chuột giữa sẽ rất linh động)

Đối với những thửa lân cận mà số thửa của nó nằm ngoài vùng chọn thì thêm vao lúc ctrình yêu cầu bổ sung.

Rồi chọn 1 điểm tại 1 vùng đủ trống để ctrình có chỗ thao tác

TB: Nhớ load file ndait_extrim trước nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cám ơn Bạn, mình chạy và xử lý được rối. Các số trên là do chương trình chuyên của các anh ấy nhập và xuất ra theo định dạng cừ họ đó anh.

Lisp giải quyết một số việc rất hay và nhanh, Cám ơn nha.

Mình nhờ Bạn tí nửa nha : Có một sô đường pline, line vẻ giao thông , thủy hệ , kí liệu bằng block,... nhưng vẩn bị đưa về chung một lớp, nhưng màu khác nhau.

Bạn có thể giúp mình chọn các đối đượng theo màu dạng Pline, line, block để đưa về lớp theo mình đặc ra được không ?

Mong được bạn giúp

Vấn đề này không khó :

 
;;Loc lay cac doi tuong theo tinh chat cua doi tuong mau
(defun c:Loc (/ LOC1 LOC2 KDT LAY COR LTYP CACHLOC OBJ)
 (luuBHT) (setvar "osmode" 0)
 (while (null (setq LOC1 (car (entsel "\nChon 1 doi tuong lam mau loc"))))
 (princ "\nKhong co doi tuong."));while
 (setvar "cmdecho" 1) (setvar "blipmode" blip) (setvar "osmode" osmo)
 (setq LOC2 (entget Loc1) KDT (cdr (assoc 0 LOC2)) LAY (cdr (assoc 8 LOC2)))
 (if (null (assoc 62 LOC2)) (setq COR 256) (setq COR (cdr (assoc 62 LOC2))))
 (if (null (assoc 6 LOC2)) (setq LTYP "BYLAYER") (setq LTYP (assoc 6 LOC2)))
 (initget "Kieu Lop Mau Dangduong")
 (setq CACHLOC (getkword "\nChon cach loc: Kieu,Lop,Mau,Dangduong "))
 (cond
((= "Kieu" CACHLOC) (sssetfirst nil (setq OBJ (ssget (list (cons 0 KDT))))))
((= "Lop" CACHLOC) (sssetfirst nil (setq OBJ (ssget (list (cons 8 LAY))))))
((= "Mau" CACHLOC) (sssetfirst nil (setq OBJ (ssget (list (cons 62 COR))))))
((= "Dangduong" CACHLOC) (sssetfirst nil (setq OBJ (ssget (list (cons 6 LTYP))))))
(t (sssetfirst nil (setq OBJ (ssget (list (cons 0 KDT) (cons 8 LAY) (cons 62 COR)
					  (cons 6 LTYP))))))
);cond
 (traBHT) (princ))

SR: Bỏ cái vụ luuBHT và traBHT

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Không chạy được bạn ơi và xuất hiện trên

"blipmode" nil

Command:

Mong bạn xen giúp

Hề hề hề,

Bạn bỏ cả (setvar "blipmode" blip) và (setvar "osmode" osmo) đi thì có nhẽ sẽ chạy được vì mấy cái giá trị này bác ấy đã có sẵn trong hàm luuBHT. Còn của bạn thì biết nó ở chỗ mô mà lấy...

Hề hề hề...

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình xóa các chổ bạn hướng dẫn, lisp chạy được, nhưng khi xuất hiện lệnh

Chon cach loc: Kieu,Lop,Mau,Dangduong

Mình không biết ý nghĩa và thao tách ra sao.

Bạn giúp mình với

Hề hề hề,

Cái ni là mình múa rìu qua mặt thợ thôi nhé. Bạn nhập một trong 4 chữ cái K, L, M, D là lisp sẽ nhận mặt thằng này, sau đó đưa vào công an kiểm tra bằng cái hàm cond đó.

Nếu bạn nhập K tức bạn chọn kiểu , Vậy là cong an nhốt nó vào ngục kiểu

Nếu bạn nhập L, tức bạn chọn lớp, Vậy thì công an nhốt nó vào ngục lớp

..........................

 

Nhốt vào đó làm chi thì lisp nó bảo rằng nó sẽ lôi thằng đó ra tùng xẻo theo cái kiểu của nó và trả cho bạn cái món mà bạn khoái khẩu. Đơn giản vậy mà.

Hề hề hề. Bạn thích xơi kiểu gì thì bạn nhập kiểu nớ vô khi lisp nó hỏi hỉ...

Chúc bạn ngon miệng.

 

À quên thực đơn của bạn gồm có:

K là kiểu đối tượng, kiểu như là line, cỉrcle, lwpolyline, block ......

L là lớp đối tượng tỷ như lớp 0, lớp define, lớp .....

M là màu đối tượng tỷ như xanh đỏ tím vàng

D là loại đường nét tỷ như continuous, dash, center ......

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình load 2 Lisp trên vào và không thao tác được.

Mong được bạn hướng dẫn lại cho.

sr nha ocinaqua. Bạn không thao tác được có nghĩa là ctrình thì không lỗi mà bạn dùng không đc phải không ?

Nếu vậy mình nói sơ lại nha :

Bạn phải load ndait_extrim trước

gọi lệnh lvtcu

Nhập tỷ lệ 5 = 500 1=1000 2=2000 4=4000

(mình thường chỉ dùng các tỷ lệ đó. còn nếu bạn muốn thêm nhiều nữa thì không khó đâu)

pick chọn vùng mà bạn muốn sẽ trích bản đồ ra đó (Vùng đặt kết quả )

Dịch chuyển màn hình đến khu vực bản đồ muốn lấy (Vùng dữ liệu cần lấy) bằng nút cuộn của con chuột

rồi chọn 1 diểm sao cho hình chữ nhật kèm theo con trỏ chộp được những gì bạn muốn

Bổ sung những text lân cận bằng cách chọn text rồi chọn điểm đặt text đó trong vùng cần lấy.

(Nếu không muốn bổ sung thì enter cho qua)

Pick chọn 1 điểm tại 1 vị trí bất kỳ sao cho vùng màn hình có đủ chỗ trống để ct mượn chỗ thao tác ( cắt xén = extrim )

Ctrình sau khi làm song sẽ tự đem kết quả đặt vào vùng mà bạn pick chọn đầu tiên

 

@: Bạn thử xem sao nhé

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình cần chuyển đổi định dạng góc đo ví dụ 145.2345 (tức là 145d23'45") thành dang 145 23 45 .nghĩa là độ là 1 biến phút 1 biến giây 1 biến.Mình đã viêt thử (tập viết ) như sau:

phần (nth 0 ll1) lấy là giá trị góc 45.2354

;;;Chuyển định dạng góc đo

(setq a ( nth 0 LL1))

(setq b (atof a))

(setq c (fix B))

(setq d (rtos C 2 0 ))

;;; nhập phan phut

(setq e (- b (fix B)))

(setq e1 (* e 100))

(setq e2 (fix e1))

(setq e3(rtos e2 2 0))

;;; nhập phan giay

(setq g (- e1 (fix e1)))

(setq g1 (* g 100))

(setq g2 (fix g1))

(setq g3(rtos g2 2 0))

nghĩa là góc sẽ la "d" "e3 " " g3".

Nhưng khi chạy thì các trường hợp đều đúng ,trường hợp duy nhất là góc có phần giây là 00 (ví dụ 45.2300 thì chương trình hiểu là 45 22 99.

Nhờ các bạn xem lỗi do đâu và viết cho gọn và trực quan hơn thì viết thế nào.

Mình không hiểu sao chữ b copy vào diễn đàn lại biến thành bộ mặt .

Xin cảm ơn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
À, nghĩa là bạn sử dụng 2 Lisp riêng của bạn trên để xử lý chọn vị trí thửa và cắt vùng đem ra ngoài và tăng tỷ lệ theo qui định phải không bạn ? Không sử dụng Lisp Cthua.lsp chứ ???

Nếu đúng như vậy, thì mình phải học cách thao tác rồi .

Sao bạn không sử dụng lisp Cthua trên và bổ sung thêm việc tăng giảm theo tỉ lệ của thửa trích đó ( xin lỗi nha đó là ý tưởng của mình ) và chỉ đưa vào ô khung, như thế sẻ thấy gọn hơn bạn.

Mong được bạn xem xét.

Ý mình là : Chọn thửa trích ---> Đưa vào khung Click ----> Tỉ lệ in là bao nhiêu ? ----> Phóng hay thu tại điểm chèn trong khung ---> Ok

Bạn dùng thử đi. Nếu dùng quen sẽ thấy rất tiện. Vì hàm lvtcu của mình nó trích vùng bản đồ trực tiếp mà. Thấy gì là copy nấy

ít lỗi do không phải tạo boundary hoặc do tọa độ không đồng phẳng.

Còn nếu chọn xong dữ liệu bản đồ rồi mới đưa vào khung thì sau khi giãn tỷ lệ nhiều khả năng bị vượt khung.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình cần chuyển đổi định dạng góc đo ví dụ 145.2345 (tức là 145d23'45") thành dang 145 23 45 .nghĩa là độ là 1 biến phút 1 biến giây 1 biến.Mình đã viêt thử (tập viết ) như sau:

phần (nth 0 ll1) lấy là giá trị góc 45.2354

;;;Chuyển định dạng góc đo

(setq a ( nth 0 LL1))

(setq b (atof a))

(setq c (fix B))

(setq d (rtos C 2 0 ))

;;; nhập phan phut

(setq e (- b (fix B)))

(setq e1 (* e 100))

(setq e2 (fix e1))

(setq e3(rtos e2 2 0))

;;; nhập phan giay

(setq g (- e1 (fix e1)))

(setq g1 (* g 100))

(setq g2 (fix g1))

(setq g3(rtos g2 2 0))

nghĩa là góc sẽ la "d" "e3 " " g3".

Nhưng khi chạy thì các trường hợp đều đúng ,trường hợp duy nhất là góc có phần giây là 00 (ví dụ 45.2300 thì chương trình hiểu là 45 22 99.

Nhờ các bạn xem lỗi do đâu và viết cho gọn và trực quan hơn thì viết thế nào.

Mình không hiểu sao chữ b copy vào diễn đàn lại biến thành bộ mặt .

Xin cảm ơn.

Mình viết như này, bạn tham khảo thêm nhé :

;;;Doi so lieu goc dang do/thap phan sang 
(defun deggoc (a)
 (setq do (float (fix a)))
 (setq b (* (- a do) 60))
 (setq phut (float (fix b)))
 (setq giay (* (- b phut) 60))
 (+ do (/ phut 100.0) (/ giay 10000.0))
);_ end of defun
;;Doi  sang do/thap phan
(defun gocdeg (goc / ph phut giay do)
 (setq do (fix goc))
 (setq ph (* (- goc do) 100.0))
 (setq phut (fix (+ ph 0.0001)))
 (setq giay (* (- ph phut) 100.0))
 (setq goc (+ (/ (+ (* phut 60.0) giay) 3600.0) do))
 goc
);_ end of defun

@: Còn cái bộ mặt cười mình cũng từng bị. Bạn click không sử dụng emoticons là đc.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình viết như này, bạn tham khảo thêm nhé :

;;;Doi so lieu goc dang do/thap phan sang 
(defun deggoc (a)
 (setq do (float (fix a)))
 (setq b (* (- a do) 60))
 (setq phut (float (fix b)))
 (setq giay (* (- b phut) 60))
 (+ do (/ phut 100.0) (/ giay 10000.0))
);_ end of defun
;;Doi  sang do/thap phan
(defun gocdeg (goc / ph phut giay do)
 (setq do (fix goc))
 (setq ph (* (- goc do) 100.0))
 (setq phut (fix (+ ph 0.0001)))
 (setq giay (* (- ph phut) 100.0))
 (setq goc (+ (/ (+ (* phut 60.0) giay) 3600.0) do))
 goc
);_ end of defun

@: Còn cái bộ mặt cười mình cũng từng bị. Bạn click không sử dụng emoticons là đc.

Bạn chưa hiểu đúng ý mình rồi ,đây là từ giá trị đo đã đúng là độ phút giây d ' '" nhưng được viết dưới dang format 125.5345 (Nghĩa là 145d 53'45" ) mình muốn viết các giá trí độ ,phút ,giây thành các biến riêng để khi xuât ra sẽ la 145 53 45 sử dụng trong chương trình của mình .

Nghĩa là thay đổi định dạng khi xuất chương trình thì 125.5345 thành 125 53 45 nghĩa là cách ra thành các biến riêng cơ.

Sau đó mình ghép thành chuỗi

(write-line (strcat "d" "e3" "g3" ).

Cảm ơn vì đã quan tâm.

Bạn xem lại đoạn mã của mình ở trên cần sửa như thế nào vì mình không đổi đơn vị góc như ý bạn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình viết như này, bạn tham khảo thêm nhé :

;;;Doi so lieu goc dang do/thap phan sang 
(defun deggoc (a)
 (setq do (float (fix a)))
 (setq b (* (- a do) 60))
 (setq phut (float (fix b)))
 (setq giay (* (- b phut) 60))
 (+ do (/ phut 100.0) (/ giay 10000.0))
);_ end of defun
;;Doi  sang do/thap phan
(defun gocdeg (goc / ph phut giay do)
 (setq do (fix goc))
 (setq ph (* (- goc do) 100.0))
 (setq phut (fix (+ ph 0.0001)))
 (setq giay (* (- ph phut) 100.0))
 (setq goc (+ (/ (+ (* phut 60.0) giay) 3600.0) do))
 goc
);_ end of defun

@: Còn cái bộ mặt cười mình cũng từng bị. Bạn click không sử dụng emoticons là đc.

Bạn chưa hiểu đúng ý mình rồi ,đây là từ giá trị đo đã đúng là độ phút giây d ' '" nhưng được viết dưới dang format 125.5345 (Nghĩa là 145d 53'45" ) mình muốn viết các giá trí độ ,phút ,giây thành các biến riêng để khi xuât ra sẽ la 145 53 45 sử dụng trong chương trình của mình .

Nghĩa là thay đổi định dạng khi xuất chương trình thì 125.5345 thành 125 53 45 nghĩa là cách ra thành các biến riêng cơ.

Sau đó mình ghép thành chuỗi

(write-line (strcat "d" "e3" "g3" ).

Cảm ơn vì đã quan tâm.

Bạn xem lại đoạn mã của mình ở trên cần sửa như thế nào vì mình không đổi đơn vị góc như ý bạn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn chưa hiểu đúng ý mình rồi ,đây là từ giá trị đo đã đúng là độ phút giây d ' '" nhưng được viết dưới dang format 125.5345 (Nghĩa là 145d 53'45" ) mình muốn viết các giá trí độ ,phút ,giây thành các biến riêng để khi xuât ra sẽ la 145 53 45 sử dụng trong chương trình của mình .

Nghĩa là thay đổi định dạng khi xuất chương trình thì 125.5345 thành 125 53 45 nghĩa là cách ra thành các biến riêng cơ.

Sau đó mình ghép thành chuỗi

(write-line (strcat "d" "e3" "g3" ).

Cảm ơn vì đã quan tâm.

Bạn xem lại đoạn mã của mình ở trên cần sửa như thế nào vì mình không đổi đơn vị góc như ý bạn.

Trong hàm deggoc của mình phut=phut/100 giay=giay/10000 đó bạn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không dùng cách của ban được góc của mình bản thân là độ phút giây rối ,viết liên nhau cách nhau 1 dâu chấm giữa độ . phutgiay liền . Đoạn mã mình đã tách thành 3 (ví dụ 123.4553 thành 123 45 53 ) nhưng sao đoạn mã của mình lại xẩy ra trường hợp 123.4500 chương trình lại tách ra là 123 44 99 .

Bạn xem và sửa giúp mã của mình với.

Mình cần thay đổi định dạng mà thôi

Cảm ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Không dùng cách của ban được góc của mình bản thân là độ phút giây rối ,viết liên nhau cách nhau 1 dâu chấm giữa độ . phutgiay liền . Đoạn mã mình đã tách thành 3 (ví dụ 123.4553 thành 123 45 53 ) nhưng sao đoạn mã của mình lại xẩy ra trường hợp 123.4500 chương trình lại tách ra là 123 44 99 .

Bạn xem và sửa giúp mã của mình với.

Mình cần thay đổi định dạng mà thôi

Cảm ơn

Của bác đây. Bác thử xem có đúng không nhé.

 

(setq a ( nth 0 LL1))

(setq b (atof a))

(setq c (fixR B))

(setq d (rtos C 2 0 ))

(setq e (- b (fixR B)))

(setq e1 (* e 100))

(setq e2 (fixR e1))

(setq e3 (rtos e1 2 0))

(setq g (- e1 (fixR e1)))

(setq g1 (* g 100))

(setq g2 (fixR g1))

(setq g3(rtos g2 2 0))

;;;;;

(defun fixR (s) (fix(atof(rtos s))))

 

Tue_NV chỉ thay hàm fix của Lisp bằng hàm fixR do mình định nghĩa

:cheers:

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Của bác đây. Bác thử xem có đúng không nhé.

 

(setq a ( nth 0 LL1))

(setq b (atof a))

(setq c (fixR B ))

(setq d (rtos C 2 0 ))

(setq e (- b (fixR B )))

(setq e1 (* e 100))

(setq e2 (fixR e1))

(setq e3 (rtos e1 2 0))

(setq g (- e1 (fixR e1)))

(setq g1 (* g 100))

(setq g2 (fixR g1))

(setq g3(rtos g2 2 0))

;;;;;

(defun fixR (s) (fix(atof(rtos s))))

 

Tue_NV chỉ thay hàm fix của Lisp bằng hàm fixR do mình định nghĩa

:undecided:

Cảm ơn bạn ,kết quả ra đúng ,nhưng mình không hiểu sao nếu không có hàm fixR của bạn thì kết quả lại sai.

Mình muốn viết thêm gì để kết quả như 199.0200 như bây giờ là 199 2 0 trở thành được 199 02 00

Nhờ bạn chỉ dẫn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn chưa hiểu đúng ý mình rồi ,đây là từ giá trị đo đã đúng là độ phút giây d ' '" nhưng được viết dưới dang format 125.5345 (Nghĩa là 145d 53'45" ) mình muốn viết các giá trí độ ,phút ,giây thành các biến riêng để khi xuât ra sẽ la 145 53 45 sử dụng trong chương trình của mình .

Nghĩa là thay đổi định dạng khi xuất chương trình thì 125.5345 thành 125 53 45 nghĩa là cách ra thành các biến riêng cơ.

Sau đó mình ghép thành chuỗi

(write-line (strcat "d" "e3" "g3" ).

Cảm ơn vì đã quan tâm.

Bạn xem lại đoạn mã của mình ở trên cần sửa như thế nào vì mình không đổi đơn vị góc như ý bạn.

Xin lỗi vì không hiểu hết ý của bạn.

Thật ra không cần định nghĩa lại hàm fix của lsp đâu.

Chỉ cần trong lúc tính toán phần phút. Sau khi nhân 100 bạn cộng thêm 1 lượng vô cùng bé vào rồi hẵng lấy Fix là né được lỗi của lsp. (Bạn tham khảo cách làm trong hàm gocdeg của mình sẽ thấy)

Về việc muốn 2 là 02 thì bạn chỉ có cách lồng vào trước 1 câu if. (Nếu phut < 10 thì thêm 0 vào trước phut. Nhớ là chỉ thêm được khi phut là biến chuỗi còn lúc so sánh là biến số thực ) Phần giây cũng vậy.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Xin lỗi vì không hiểu hết ý của bạn.

Không sao bạn ạ ,chương trình của bạn chưa giúp cho mình thì giúp cho nhiều bạn khác .

Cảm ơn bạn đã quan tâm .

bạn xem có hàm gì để giá trị không có nghĩa 0 hiện lên sau đoạn mã đó Ví dụ :125 02 03 or 00 00 01 chứ không phải như bây giờ là 125 2 3 và 0 0 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×