Đến nội dung


Hình ảnh
- - - - -

[Đã xong] Lisp cộng trừ số thập phân


  • Please log in to reply
5 replies to this topic

#1 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 20 June 2011 - 11:24 PM

Sáng nay mình post bài nhưng bị nhầm. sau đó mất điện nên ko làm gì được.
Bây giờ mình up lên 1 file mới kèm yêu cầu cụ thể. các bạn giúp đỡ nhé. http://www.mediafire...f5oie0lea8r4aya

Bài toán này có thể gộp về 1 yêu cầu đơn giản hơn là (cộng)trừ tất cả các số thập phân (số nguyên ở trên, số thập phân ở dưới) cho duy nhất 1 hằng số cố định. miêu tả cụ thể trong bản vẽ.
Lần trước mình nêu ra 3 yêu cầu nhỏ bởi vì có những lúc mình chỉ cần làm 1 trong 3 bước đó nên nêu yêu cầu như vậy.
còn về khoảng cách tại sao yêu cầu là 0.4 thì có 2 nguyên nhân:
thứ nhất là do yêu cầu bản vẽ phải như thế, thứ 2 là mình nghĩ nên có 1 khoảng cách cụ thể để lisp lọc được những con số cần nối với nhau. Ở đây cụ thể là chân text A và đầu text B có cùng giá trị Y, cách nhau 0.8 thì nối với nhau thành A.B; tránh trường hợp như 1 số lisp nối text khác, bị nối nhầm khi nhiều text ở gần nhau.
Nếu có thể, các bạn giúp mình 2 lisp:
1. cộng (trừ) tất cả câc cao độ trên bình đồ cho 1 hằng số, in luôn ra kết quả thay thế các số đó.
2. lisp lần lượt thực hiện 3 bước theo yêu cầu trong bản vẽ.
thanks

Hề hề hề,
Cái lisp thứ hai thì bạn phải chờ thêm một chút vì nó hơi loằng ngoằng hơn.
Còn cái líp thứ nhất thì bạn dùng thử cái này coi sao hè.

(defun c:chgev (/ psl tsl hs key_ctnc1 key_ctnc p0 p1 el1 el2 t1 t2 t3 t4 htxt num vt)
(vl-load-com)
(command "undo" "be")
(alert "\n Chon tap hop diem can thay doi cao do")
(setq psl (acet-ss-to-list (ssget "W" (setq pt1 (getpoint "\n Diem chon 1")) (setq pt2 (getpoint pt1 "\n Diem chon 2")) (list (cons 0 "POINT")))))
(setq tsl (acet-ss-to-list (ssget "W" pt1 pt2 (list (cons 0 "TEXT")))))
(setq hs (getreal "\n Nhap hang so tinh toan: "))
(if (not key_ctnc1) (setq key_ctnc1 "C"))
(initget "c t n h")
(setq key_ctnc (getkword (strcat "\Cong/Tru/Nhan/cHia [C/T/N/H] <" key_ctnc1 ">: ")))
(if (not key_ctnc) (setq key_ctnc key_ctnc1) (setq key_ctnc1 key_ctnc))
(foreach p psl
(setq p0 (cdr (assoc 10 (entget p))))
(foreach txt tsl
(setq p1 (cdr (assoc 11 (entget txt))))
(if (= (cadr p1) (cadr p0))
(progn
(if (equal (- (car p0) (car p1)) 0.4 0.001)
(progn
(setq el1 (entget txt))
(setq t1 (cdr (assoc 1 el1)))
)
)
(if (equal (- (car p1) (car p0)) 0.4 0.001)
(progn
(setq el2 (entget txt))
(setq t2 (cdr (assoc 1 el2 )))
)
)
)
)
)
(if (and t1 t2)
(progn
(setq num (congtrunhanchia key_ctnc (atof (strcat t1 "." t2)) hs)) ;;;;;;;;;;;; (- (atof (strcat t1 "." t2)) hs))
(setq htxt (rtos num 2 2)
vt (vl-string-position (ascii ".") htxt)
t3 (substr htxt 1 vt)
t4 (substr htxt (+ vt 2))
el1 (subst (cons 1 t3) (assoc 1 el1) el1)
el2 (subst (cons 1 t4) (assoc 1 el2) el2)
)
(entmod el1)
(entmod el2)
)
)
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;
(defun congtrunhanchia (pheptinh sohang1 sohang2 / kq)
(cond
((= (strcase pheptinh) "C") (setq kq (+ sohang1 sohang2)))
((= (strcase pheptinh) "T") (setq kq (- sohang1 sohang2)))
((= (strcase pheptinh) "N") (setq kq (* sohang1 sohang2)))
((= (strcase pheptinh) "H") (setq kq (/ sohang1 sohang2)))
)
kq
)

Hề hề hề,
trong lisp này, mình mượn cái hàm cộng trừ nhân chia của bác hochoaihetdot trên diễn đàn để bạn tha hồ lựa chọn, muốn cộng hay trừ hay nhân hay chia cái cao độ với một hằng số nào đó thì tùy hỉ. Hãy cám ơn bác ấy bằng cách nhấn dấu + ở bài post của bác ấy nha
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2 gasmanc

gasmanc

    biết vẽ line

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

Đã gửi 21 June 2011 - 09:25 AM

Hề hề hề,
Cái lisp thứ hai thì bạn phải chờ thêm một chút vì nó hơi loằng ngoằng hơn.
Còn cái líp thứ nhất thì bạn dùng thử cái này coi sao hè.


(defun c:chgev (/ psl tsl hs key_ctnc1 key_ctnc p0 p1 el1 el2 t1 t2 t3 t4 htxt num vt)
(vl-load-com)
(command "undo" "be")
(alert "\n Chon tap hop diem can thay doi cao do")
(setq psl (acet-ss-to-list (ssget "W" (setq pt1 (getpoint "\n Diem chon 1")) (setq pt2 (getpoint pt1 "\n Diem chon 2")) (list (cons 0 "POINT")))))
(setq tsl (acet-ss-to-list (ssget "W" pt1 pt2 (list (cons 0 "TEXT")))))
(setq hs (getreal "\n Nhap hang so tinh toan: "))
(if (not key_ctnc1) (setq key_ctnc1 "C"))
(initget "c t n h")
(setq key_ctnc (getkword (strcat "\Cong/Tru/Nhan/cHia [C/T/N/H] <" key_ctnc1 ">: ")))
(if (not key_ctnc) (setq key_ctnc key_ctnc1) (setq key_ctnc1 key_ctnc))
(foreach p psl
(setq p0 (cdr (assoc 10 (entget p))))
(foreach txt tsl
(setq p1 (cdr (assoc 11 (entget txt))))
(if (= (cadr p1) (cadr p0))
(progn
(if (equal (- (car p0) (car p1)) 0.4 0.001)
(progn
(setq el1 (entget txt))
(setq t1 (cdr (assoc 1 el1)))
)
)
(if (equal (- (car p1) (car p0)) 0.4 0.001)
(progn
(setq el2 (entget txt))
(setq t2 (cdr (assoc 1 el2 )))
)
)
)
)
)
(if (and t1 t2)
(progn
(setq num (congtrunhanchia key_ctnc (atof (strcat t1 "." t2)) hs)) ;;;;;;;;;;;; (- (atof (strcat t1 "." t2)) hs))
(setq htxt (rtos num 2 2)
vt (vl-string-position (ascii ".") htxt)
t3 (substr htxt 1 vt)
t4 (substr htxt (+ vt 2))
el1 (subst (cons 1 t3) (assoc 1 el1) el1)
el2 (subst (cons 1 t4) (assoc 1 el2) el2)
)
(entmod el1)
(entmod el2)
)
)
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;
(defun congtrunhanchia (pheptinh sohang1 sohang2 / kq)
(cond
((= (strcase pheptinh) "C") (setq kq (+ sohang1 sohang2)))
((= (strcase pheptinh) "T") (setq kq (- sohang1 sohang2)))
((= (strcase pheptinh) "N") (setq kq (* sohang1 sohang2)))
((= (strcase pheptinh) "H") (setq kq (/ sohang1 sohang2)))
)
kq
)

Hề hề hề,
trong lisp này, mình mượn cái hàm cộng trừ nhân chia của bác hochoaihetdot trên diễn đàn để bạn tha hồ lựa chọn, muốn cộng hay trừ hay nhân hay chia cái cao độ với một hằng số nào đó thì tùy hỉ. Hãy cám ơn bác ấy bằng cách nhấn dấu + ở bài post của bác ấy nha

cảm ơn bạn.Mình vẫn chờ lisp thứ 2 của bạn.
với lisp thứ nhất này, bạn có thể hướng dẫn mình cách sử dụng không? mình không hiểu cách chọn "tập hợp điểm cần thay đổi cao độ" chọn "điểm chọn 1", "điểm chọn 2" là cái gì.
  • 0

#3 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 21 June 2011 - 01:42 PM

cảm ơn bạn.Mình vẫn chờ lisp thứ 2 của bạn.
với lisp thứ nhất này, bạn có thể hướng dẫn mình cách sử dụng không? mình không hiểu cách chọn "tập hợp điểm cần thay đổi cao độ" chọn "điểm chọn 1", "điểm chọn 2" là cái gì.

Hề hề hề,
1/- Về cái lisp thứ nhất:
Khi lisp thông báo "Chon tap hop diem can thay dổi cao do" tức là bạn hiểu việc làm tiếp theo của bạn là phải chọn tập hợp các điểm mà bạn muốn thay đổi cao độ của nó. Khi bạn đọc xong thông báo và hiểu được mình cần làm gi thì bạn nhấn nút OK trên thông báo để tắt n1o đi và lisp tiếp tục chạy.
Khi lisp thông báo điểm chọn 1 là nhắc bạn phải chọn một điểm trên màn hình mà điểm đó là một đầu của ô chữ nhật sẽ bao quanh các đối tượng được chọn.
Khi lisp thông báo điểm chọn 2 là nhắc bạn chọn điểm mút thứ hai của ô chữ nhật sẽ bao quanh các đối tượng cần chọn.
Sau khi bạn đã chọn được hai điểm này thì lisp sẽ chọn tất cả các đối tượng nằm trong ô chữ nhật có đường chéo là đoạn thẳng nối hai điểm bạn vừa chọn, tất nhiên các đối tượng được chọn phải thỏa mãn điều kiện lọc của hàm SSget trong lisp.
Khi lisp yêu cầu Nhap hang so tinh toan bạn phải nhập một giá trị số thực đúng với giá trị mà bạn muốn cộng thêm hay bớt đi hay nhân thêm hay chia ra đối với các cao độ của các điểm mà bạn đã chọn ở trên.
Khi lisp yêu cầu Cong/Tru/Nhan/Chia <C> thì bạn phải nhập một trong 4 chữ cái c, t, n, h tương ứng với các phép tính mà bạn định dùng.
Sau đó lisp sẽ tự chạy và thay giá trị các text cao độ của các điểm được chọn ở trên bằng các text cao độ mới, kết quả của các phép tính trên.
Hề hề hề, vận là tuyệt cú mèo, đúng với ý định của bạn hỉ??? Có cần bổ sung chi thêm không hè????
2/- Về cái lisp thứ hai thì hiện tại mình đang hóc cái xương cụ là các yêu cầu do bạn đặt ra. Đó là sau khi nhập thành 1 text lạ phải đặt text này vào bản vẽ sao cho:
- Khoảng cách giữa ký tự "." và các ký tự đứng trước và sau nó là 0.4
- Vị trí của ký tự "." phải đúng với vị trí của point.
Đây là những yêu cầu khá oái oăm vì khoảng cách giữa các ký tự trong chuỗi hoàn toàn không giống nhau tùy thuộc vào loại font chữ, vào hình dạng ký tự và vào cả số lượng ký tự trong chuỗi nữa. Mình cũng đã xem xét tới biến width scale factor nhưng vẫn không giải quyết được chính xác yêu cầu của bạn.
Vậy bạn hãy chờ các bác khác ra tay nhé.
Hề hề hề, chúc bạn vui.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 gasmanc

gasmanc

    biết vẽ line

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

Đã gửi 21 June 2011 - 10:25 PM

Hề hề hề,
1/- Về cái lisp thứ nhất:
Khi lisp thông báo "Chon tap hop diem can thay dổi cao do" tức là bạn hiểu việc làm tiếp theo của bạn là phải chọn tập hợp các điểm mà bạn muốn thay đổi cao độ của nó. Khi bạn đọc xong thông báo và hiểu được mình cần làm gi thì bạn nhấn nút OK trên thông báo để tắt n1o đi và lisp tiếp tục chạy.
Khi lisp thông báo điểm chọn 1 là nhắc bạn phải chọn một điểm trên màn hình mà điểm đó là một đầu của ô chữ nhật sẽ bao quanh các đối tượng được chọn.
Khi lisp thông báo điểm chọn 2 là nhắc bạn chọn điểm mút thứ hai của ô chữ nhật sẽ bao quanh các đối tượng cần chọn.
Sau khi bạn đã chọn được hai điểm này thì lisp sẽ chọn tất cả các đối tượng nằm trong ô chữ nhật có đường chéo là đoạn thẳng nối hai điểm bạn vừa chọn, tất nhiên các đối tượng được chọn phải thỏa mãn điều kiện lọc của hàm SSget trong lisp.
Khi lisp yêu cầu Nhap hang so tinh toan bạn phải nhập một giá trị số thực đúng với giá trị mà bạn muốn cộng thêm hay bớt đi hay nhân thêm hay chia ra đối với các cao độ của các điểm mà bạn đã chọn ở trên.
Khi lisp yêu cầu Cong/Tru/Nhan/Chia <C> thì bạn phải nhập một trong 4 chữ cái c, t, n, h tương ứng với các phép tính mà bạn định dùng.
Sau đó lisp sẽ tự chạy và thay giá trị các text cao độ của các điểm được chọn ở trên bằng các text cao độ mới, kết quả của các phép tính trên.
Hề hề hề, vận là tuyệt cú mèo, đúng với ý định của bạn hỉ??? Có cần bổ sung chi thêm không hè????
2/- Về cái lisp thứ hai thì hiện tại mình đang hóc cái xương cụ là các yêu cầu do bạn đặt ra. Đó là sau khi nhập thành 1 text lạ phải đặt text này vào bản vẽ sao cho:
- Khoảng cách giữa ký tự "." và các ký tự đứng trước và sau nó là 0.4
- Vị trí của ký tự "." phải đúng với vị trí của point.
Đây là những yêu cầu khá oái oăm vì khoảng cách giữa các ký tự trong chuỗi hoàn toàn không giống nhau tùy thuộc vào loại font chữ, vào hình dạng ký tự và vào cả số lượng ký tự trong chuỗi nữa. Mình cũng đã xem xét tới biến width scale factor nhưng vẫn không giải quyết được chính xác yêu cầu của bạn.
Vậy bạn hãy chờ các bác khác ra tay nhé.
Hề hề hề, chúc bạn vui.

chào bạn phamthanhbinh. Mình có chút vấn đền nữa muốn hỏi bạn.
thứ nhất, về lisp của bạn đã viết, mình không dùng được với mẫu bản vẽ mình đã gửi lên làm ví dụ được. Không biết là hàm lọc ssget đòi hỏi các đối tượng (ở đây là text) phải như thế nào. Xin bạn nói rõ hơn
thứ 2, với yêu cầu về lisp thứ 2 của mình, mình xin nói rõ hơn như sau:
2 đối tượng text trước khi nối lại thành 1 số (ở đây lấy 1 ví dụ trong bản vẽ là 9.47) thì số 9 làcóđược canh lề rigt, số 47 được canh lề top left. như thế, tọa độ của số 9 được xác định bởi điểm chân text phía ngoài cùng bên phải ( cụ thể trong ví dụ là 25.11;315.59) mà không quan tâm text dài ngắn thế nào, font ra sao phải không?
tương tự như vậy, số 47 có tọa độ xác định bởi góc trên bên trái và cũng ko đổi với mọi font và độ dài của text.(cụ thể 25.91;315.59)
từ suy luận trên, tôi nghĩ là hẳn sẽ có thuật toán cho phép xác định khoảng cách giữa 2 text dựa vào sự canh lề này. với ý nghĩ nông cạn của tôi trong lĩnh vực thuật toán cho lisp, tôi chỉ đơn thuần nghĩ, có thể sẽ có thuật toán nào đó chẳng hạn, lọc từ bản vẽ ra 2 tập hợp, một tập hợp số được canh lề rigt (là các số nằm trên điểm point như số 9), một tập hợp số được canh lề top left (là tập hợp các số nằm dưới điểm point như số 47). move tập hợp số thứ 2 lên môt khoảng băng chiều cao text (cụ thể ở đây là 2) sau đó lựa chọn các text từ 2 tập hợp, nếu khoảng cách bằng 0.8 thì nối lại thành 1 text. Để tránh text sau khi nối không đúng vị trí, ta lại sử dụng thuật toán nào đó định dạng text canh lề rigt, cách điểm point 1 khoảng 0.4 chẳng hạn. sau khi nối lại, các số này sẽ dễ dàng dùng 1 thuật toán cộng trừ nhân chia đã có sẵn để thực hiện phép tính. kết quả được in ra thay thế cho các số cũ. sau đó lại tách ra. nhưng chả biết có thuật toán nào như vậy không nữa. huhu
nhờ bạn phamthanhbinh và các bạn giỏi lisp trong diễn đàn giúp mình với.
  • 0

#5 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 21 June 2011 - 11:21 PM

chào bạn phamthanhbinh. Mình có chút vấn đền nữa muốn hỏi bạn.
thứ nhất, về lisp của bạn đã viết, mình không dùng được với mẫu bản vẽ mình đã gửi lên làm ví dụ được. Không biết là hàm lọc ssget đòi hỏi các đối tượng (ở đây là text) phải như thế nào. Xin bạn nói rõ hơn
thứ 2, với yêu cầu về lisp thứ 2 của mình, mình xin nói rõ hơn như sau:
2 đối tượng text trước khi nối lại thành 1 số (ở đây lấy 1 ví dụ trong bản vẽ là 9.47) thì số 9 làcóđược canh lề rigt, số 47 được canh lề top left. như thế, tọa độ của số 9 được xác định bởi điểm chân text phía ngoài cùng bên phải ( cụ thể trong ví dụ là 25.11;315.59) mà không quan tâm text dài ngắn thế nào, font ra sao phải không?
tương tự như vậy, số 47 có tọa độ xác định bởi góc trên bên trái và cũng ko đổi với mọi font và độ dài của text.(cụ thể 25.91;315.59)
từ suy luận trên, tôi nghĩ là hẳn sẽ có thuật toán cho phép xác định khoảng cách giữa 2 text dựa vào sự canh lề này. với ý nghĩ nông cạn của tôi trong lĩnh vực thuật toán cho lisp, tôi chỉ đơn thuần nghĩ, có thể sẽ có thuật toán nào đó chẳng hạn, lọc từ bản vẽ ra 2 tập hợp, một tập hợp số được canh lề rigt (là các số nằm trên điểm point như số 9), một tập hợp số được canh lề top left (là tập hợp các số nằm dưới điểm point như số 47). move tập hợp số thứ 2 lên môt khoảng băng chiều cao text (cụ thể ở đây là 2) sau đó lựa chọn các text từ 2 tập hợp, nếu khoảng cách bằng 0.8 thì nối lại thành 1 text. Để tránh text sau khi nối không đúng vị trí, ta lại sử dụng thuật toán nào đó định dạng text canh lề rigt, cách điểm point 1 khoảng 0.4 chẳng hạn. sau khi nối lại, các số này sẽ dễ dàng dùng 1 thuật toán cộng trừ nhân chia đã có sẵn để thực hiện phép tính. kết quả được in ra thay thế cho các số cũ. sau đó lại tách ra. nhưng chả biết có thuật toán nào như vậy không nữa. huhu
nhờ bạn phamthanhbinh và các bạn giỏi lisp trong diễn đàn giúp mình với.

Hề hề hề,
Cách chạy lisp thứ nhất mình đã nói khá rõ rồi. bạn cứ chạy đúng như thế là Ok vì mình đã chạy thử với cả hai bản vẽ bạn pót lên rồi. Kết quả ngon
Nếu bạn vẫn chưa thông thì có thể dùng cái lisp mình đã sửa trong bài post số 3863 phía trên. Lisp mới này sẽ chạy nhanh hơn lisp trước nhất là khi vùng chọn có nhiều point.
Với lisp thứ hai, mình đang nghĩ cách giải quyết vấn đề khác với cách bạn nghĩ nhiều. Đó là chả nối hai thằng làm một làm gì mà ngược lại là chuyển từ hai text thành 3 text, tức là thêm một thằng cu text "." nữa và đặt thằng cu này vào trung cái point.
Vấn đề cộng trừ nhân chia chi đó thì đã giải quyết được trong lisp thứ nhất rồi.
Tuy nhiên cũng cần chút thời gian chứ chẳng thể có ngay cho bạn được.
Hề hề hề, hãy chịu khó đợi thêm chút nữa hỉ.....

Và đây là cái lisp chuyển các text về thẳng hàng dạng A.B thỏa mãn yêu cầu của bạn nhưng không phải là một text mà là bao gồm 3 text riêng biệt.Lisp này cũng thực hiện các phép tính với hằng số cho trước như lisp cũ và trả ra là kết quả đã được tính toán. Nếu bạn muốn giá trị cao độ không đổi thì nhập hằng số tính toán là 0 với phép tính là cộng hay trừ hoặc nhập hằng số tính toán là 1 với các phép tính là nhân hay chia.
Bạn hãy dùng thử và cho ý kiến nha.


;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=13203&st=3840
(defun c:chgev (/ psl tsl hs key_ctnc1 key_ctnc p0 p1 el1 el2 t1 t2 t3 t4 ts htxt num vt )
(vl-load-com)
(command "undo" "be")
(setq UC (getvar "ucsname"))
(command "ucs" "World")
(alert "\n Chon tap hop diem can thay doi cao do")
(setq psl (acet-ss-to-list (ssget (list (cons 0 "POINT")))))
;;;; (setq tsl (acet-ss-to-list (ssget "W" pt1 pt2 (list (cons 0 "TEXT")))))
(setq hs (getreal "\n Nhap hang so tinh toan: "))
(if (not key_ctnc1) (setq key_ctnc1 "C"))
(initget "c t n h")
(setq key_ctnc (getkword (strcat "\Cong/Tru/Nhan/cHia [C/T/N/H] <" key_ctnc1 ">: ")))
(if (not key_ctnc) (setq key_ctnc key_ctnc1) (setq key_ctnc1 key_ctnc))
(foreach p psl
(setq p0 (cdr (assoc 10 (entget p))))
(setq pt1 (list (- (car p0) 1) (- (cadr p0) 2)))
(setq pt2 (list (+ (car p0) 1) (+ (cadr p0) 2)))
(setq tsl (acet-ss-to-list (ssget "C" pt1 pt2 (list (cons 0 "TEXT")))))
(foreach txt tsl
(setq p1 (cdr (assoc 11 (entget txt))))
(if (= (cadr p1) (cadr p0))
(progn
(if (equal (- (car p0) (car p1)) 0.4 0.001)
(progn
(setq el1 (entget txt))
(setq t1 (cdr (assoc 1 el1)))
)
)
(if (equal (- (car p1) (car p0)) 0.4 0.001)
(progn
(setq el2 (entget txt))
(setq t2 (cdr (assoc 1 el2 )))
)
)
)
)
)
(if (and t1 t2)
(progn
(entmake (list (cons 0 "text") (assoc 8 el2) (cons 10 p0) (cons 11 p0) (assoc 40 el2) (assoc 7 el2) (cons 1 ".") (cons 72 1)))
(setq ts (entlast))
(setq el2 (subst (cons 73 0) (assoc 73 el2) el2)
el2 (subst (cons 10 (cdr (assoc 11 el2))) (assoc 10 el2) el2))
(entmod el2)
(setq num (congtrunhanchia key_ctnc (atof (strcat t1 "." t2)) hs)) ;;;;;;;;;;;; (- (atof (strcat t1 "." t2)) hs))
(setq htxt (rtos num 2 2)
vt (vl-string-position (ascii ".") htxt)
t3 (substr htxt 1 vt)
t4 (substr htxt (+ vt 2))
el1 (subst (cons 1 t3) (assoc 1 el1) el1)
el2 (subst (cons 1 t4) (assoc 1 el2) el2)
)
(entmod el1)
(entmod el2)
)
)
)
(command "ucs" uc)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;
(defun congtrunhanchia (pheptinh sohang1 sohang2 / kq)
(cond
((= (strcase pheptinh) "C") (setq kq (+ sohang1 sohang2)))
((= (strcase pheptinh) "T") (setq kq (- sohang1 sohang2)))
((= (strcase pheptinh) "N") (setq kq (* sohang1 sohang2)))
((= (strcase pheptinh) "H") (setq kq (/ sohang1 sohang2)))
)
kq
)

Chúc bạn vui

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 22 June 2011 - 01:12 AM
Bổ sung lisp

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

#6 vinhxtkt01

vinhxtkt01

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: -3 (bình thường)

Đã gửi 01 March 2014 - 12:22 AM

mình vừa tìm được trên diễn đàn đoạn code trừ 2 số trong autocad rất hay:

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.c...-lisp-tru-2-so/
(defun c:-()
  (vl-load-com)  
     (setq sbt (car (entsel "\nChon so bi tru:"))
           st (car (entsel "\nChon so tru:\n"))
           kq (- (atof (cdr (assoc 1 (entget sbt))))
             (atof (cdr (assoc 1 (entget st))))))      
     (princ kq)
  (setq obj (vlax-ename->vla-object (car (entsel "\nChon text ghi ket qua:"))))
  (vla-put-TextString obj (rtos kq 2 2))  
  (princ))

 

Nhưng mình muốn sửa lại chỗ này một tí ai biết giúp mình với. Mình không rành về lisp cho lắm:

Làm sao để đoạn lisp này đối với phép trừ khi cho ra số dương thì có thêm dấu cộng (+) ở phía trước.

Mình hay làm bên san ủi mặt bằng nên cần đánh dấu vào (+) hoặc (-) vào trong các cao độ thiết kế mắt lưới.

Ai biết giúp mình chỉnh sửa lại một tí.

Chân thành cảm ơn!


  • -1