Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

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


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#2861 NguyenNdait

NguyenNdait

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 16 December 2010 - 04:57 PM

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
  • 0

Mầm non phường ba - Đây ta mầm cụ
Lãnh tụ non sông - Ngộ không.


#2862 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 16 December 2010 - 05:33 PM

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ề...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2863 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 16 December 2010 - 07:10 PM

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 ......
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2864 NguyenNdait

NguyenNdait

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 17 December 2010 - 08:31 AM

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é
  • 1

Mầm non phường ba - Đây ta mầm cụ
Lãnh tụ non sông - Ngộ không.


#2865 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 09:08 AM

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.
  • 0

#2866 NguyenNdait

NguyenNdait

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 17 December 2010 - 12:55 PM

À, 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.
  • 0

Mầm non phường ba - Đây ta mầm cụ
Lãnh tụ non sông - Ngộ không.


#2867 NguyenNdait

NguyenNdait

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 17 December 2010 - 01:05 PM

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.
  • 0

Mầm non phường ba - Đây ta mầm cụ
Lãnh tụ non sông - Ngộ không.


#2868 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 01:21 PM

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.
  • 0

#2869 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 01:21 PM

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.
  • 0

#2870 NguyenNdait

NguyenNdait

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 17 December 2010 - 01:27 PM

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
  • 0

Mầm non phường ba - Đây ta mầm cụ
Lãnh tụ non sông - Ngộ không.


#2871 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 01:37 PM

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
  • 0

#2872 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 17 December 2010 - 03:08 PM

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:
  • 1

#2873 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 03:27 PM

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.
  • 0

#2874 NguyenNdait

NguyenNdait

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 17 December 2010 - 03:41 PM

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.
  • 0

Mầm non phường ba - Đây ta mầm cụ
Lãnh tụ non sông - Ngộ không.


#2875 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 03:54 PM

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
  • 0

#2876 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 17 December 2010 - 03:58 PM

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.

Đó là 1 lỗi khó hiểu của Lisp.
Bác thử cái này nhé :
(setq a ( nth 0 LL1))
(setq b (atof a))
(setq c (fixR B))
(setq d (prefix0 C))

(setq e (- b (fixR B)))
(setq e1 (* e 100))
(setq e2 (fixR e1))
(setq e3 (prefix0 e2))


(setq g (- e1 (fixR e1)))
(setq g1 (* g 100))
(setq g2 (fixR g1))
(setq g3 (prefix0 g2))
;;;;;
(defun fixR (s) (fix(atof(rtos s))))
(defun prefix0 (s)
(if (< s 10)
(strcat "0" (itoa s))
(itoa s)
)
)

Bài viết đã được chỉnh sửa nội dung bởi Tue_NV: 17 December 2010 - 04:01 PM

  • 1

#2877 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 17 December 2010 - 04:20 PM

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.

Chào bạn NDBNGO,
Lỗi của bạn là do cái hàm fix của lisp nó gây ra. Vì sao thì bạn chịu khó hỏi thằng Autodesk chứ mình cũng không giải thích được bạn ạ.
Để khắc phục cái lỗi này, mình dùng kiểu cắt chuỗi.
Bạn xài thử xem nhé. Nhớ là khi nhập chuỗi thì bạn phải nhập đúng định dạng mà bạn đã post, tức là sử dụng dấu chấm thập phân và phần thập phân có 4 chữ số bạn nhé. Nếu không líp nó chê xấu giai nó không cưới đâu. Cô nàng này đỏng đảnh lắm.
Như vậy nó cũng khắc phục được luôn cái lỗi như của lisp bác Tue_NV đã viết tức là 199.0299 sẽ thành 199 02 99 chứ không phải 199 2 99.
Bạn thử coi sao nhé.

(defun c:doit ()
(setq txt (getstring "\n Nhap text can doi: "))
(if (not (wcmatch txt "*.####"))
(alert "\Text sai dinh dang, hay lam lai")
(progn
(setq n (strlen txt)
i 0)
(repeat n
(if (= (substr txt (1+ i) 1) ".")
(setq k (1+ i))
)
(setq i (1+ i))
)
(setq t1 (substr txt 1 (1- k))
t2 (substr txt (1+ k) 2)
t3 (substr txt (+ 3 k) 2)
txt (strcat t1 " " t2 " " t3)
)
)
)
)

Chúc bạn vui.
Nếu có gì chưa vừa ý thì hãy post lên nhé để mình hoàn thiện nó.

À mà quên mất, nếu bạn đã có một list các góc theo đúng dịnh dạng trên thì bạn có thể sử dụng (setq txt (nth 0 LL1)) thay cho (setq txt (gestring .....)).
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2878 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 04:29 PM

Đó là 1 lỗi khó hiểu của Lisp.
Bác thử cái này nhé :
(setq a ( nth 0 LL1))
(setq b (atof a))
(setq c (fixR B ))
(setq d (prefix0 C))

(setq e (- b (fixR B )))
(setq e1 (* e 100))
(setq e2 (fixR e1))
(setq e3 (prefix0 e2))
(setq g (- e1 (fixR e1)))
(setq g1 (* g 100))
(setq g2 (fixR g1))
(setq g3 (prefix0 g2))
;;;;;
(defun fixR (s) (fix(atof(rtos s))))
(defun prefix0 (s)
(if (< s 10)
(strcat "0" (itoa s))
(itoa s)
)
)

Về lý thuyết thì khi thêm đoạn mã của bạn vào thì sẽ thêm số o đằng trước những số nhỏ hơn 10 ,nhưng thực tế mình cho vào chạy kết quả vẫn như cũ ,nghĩa là số o không được hiện thị.
  • 0

#2879 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 17 December 2010 - 04:38 PM

Chào bạn NDBNGO,
Lỗi của bạn là do cái hàm fix của lisp nó gây ra. Vì sao thì bạn chịu khó hỏi thằng Autodesk chứ mình cũng không giải thích được bạn ạ.
Để khắc phục cái lỗi này, mình dùng kiểu cắt chuỗi.
Bạn xài thử xem nhé. Nhớ là khi nhập chuỗi thì bạn phải nhập đúng định dạng mà bạn đã post, tức là sử dụng dấu chấm thập phân và phần thập phân có 4 chữ số bạn nhé. Nếu không líp nó chê xấu giai nó không cưới đâu. Cô nàng này đỏng đảnh lắm.
Như vậy nó cũng khắc phục được luôn cái lỗi như của lisp bác Tue_NV đã viết tức là 199.0299 sẽ thành 199 02 99 chứ không phải 199 2 99.
Bạn thử coi sao nhé.


(defun c:doit ()
(setq txt (getstring "\n Nhap text can doi: "))
(if (not (wcmatch txt "*.####"))
(alert "\Text sai dinh dang, hay lam lai")
(progn
(setq n (strlen txt)
i 0)
(repeat n
(if (= (substr txt (1+ i) 1) ".")
(setq k (1+ i))
)
(setq i (1+ i))
)
(setq t1 (substr txt 1 (1- k))
t2 (substr txt (1+ k) 2)
t3 (substr txt (+ 3 k) 2)
txt (strcat t1 " " t2 " " t3)
)
)
)
)

Chúc bạn vui.
Nếu có gì chưa vừa ý thì hãy post lên nhé để mình hoàn thiện nó.

À mà quên mất, nếu bạn đã có một list các góc theo đúng dịnh dạng trên thì bạn có thể sử dụng (setq txt (nth 0 LL1)) thay cho (setq txt (gestring .....)).

Đoạn lisp mà mình viết ,là 1 chương trình con trong cả 1 chương trình về lisp về lisp đã hoàn thiện ,mình chỉ thay 1 số định dạng để cho phù hợp .Vây bạn có thể viết trực tiếp thêm đoạn lisp của TUE_NV để kêt quả ra đúng được không.
Cảm ơn nhiểu.
  • 0

#2880 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 17 December 2010 - 04:40 PM

Chào bạn NDBNGO,
Lỗi của bạn là do cái hàm fix của lisp nó gây ra. Vì sao thì bạn chịu khó hỏi thằng Autodesk chứ mình cũng không giải thích được bạn ạ.
Để khắc phục cái lỗi này, mình dùng kiểu cắt chuỗi.
Bạn xài thử xem nhé. Nhớ là khi nhập chuỗi thì bạn phải nhập đúng định dạng mà bạn đã post, tức là sử dụng dấu chấm thập phân và phần thập phân có 4 chữ số bạn nhé. Nếu không líp nó chê xấu giai nó không cưới đâu. Cô nàng này đỏng đảnh lắm.
Như vậy nó cũng khắc phục được luôn cái lỗi như của lisp bác Tue_NV đã viết tức là 199.0299 sẽ thành 199 02 99 chứ không phải 199 2 99.
Bạn thử coi sao nhé.


(defun c:doit ()
(setq txt (getstring "\n Nhap text can doi: "))
(if (not (wcmatch txt "*.####"))
(alert "\Text sai dinh dang, hay lam lai")
(progn
(setq n (strlen txt)
i 0)
(repeat n
(if (= (substr txt (1+ i) 1) ".")
(setq k (1+ i))
)
(setq i (1+ i))
)
(setq t1 (substr txt 1 (1- k))
t2 (substr txt (1+ k) 2)
t3 (substr txt (+ 3 k) 2)
txt (strcat t1 " " t2 " " t3)
)
)
)
)

Chúc bạn vui.
Nếu có gì chưa vừa ý thì hãy post lên nhé để mình hoàn thiện nó.

À mà quên mất, nếu bạn đã có một list các góc theo đúng dịnh dạng trên thì bạn có thể sử dụng (setq txt (nth 0 LL1)) thay cho (setq txt (gestring .....)).

Tuy nhiên, Code trên đầy đủ định dạng thì Lisp mới chạy.
Với code trên của bài viết trên của Tue_NV thì không cần đúng định dạng (có 4 chữ số thập phân) nó vẫn chạy như thường????
Lisp nào có chê xâu chai hay là đẹp chai đâu hở bác? Nó đâu có chê, chỉ cần chăm chỉ, cần cù thật tâm đến với nó là nó chịu liền à??

Ôi, bác Bình ơi. Lisp mà Tue_Nv viết có lỗi chi đâu Bác Bình ơi?
Bác đã thử code của Tue_NV chưa mờ kiu lỗi dậy???
  • 0