Đến nội dung


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

Viết Lisp theo yêu cầu


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

#921 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 04 August 2008 - 01:19 PM

Xin nhờ bác Nguyễn Hoành chỉnh lại lisp C:MTP vì khi chọn nhiều đối tượng cặp "TEXT - POINT" thì vị trí text và point không khớp nhau.
Cụ thể : text ghi 413.25 point có Z=413.25 phải trùng nhau. Lisp của bác chọn từng cặp thì được nhưng nhiều cặp là bị loạn xà bần
Cám ơn bác trước nhé

Tại sao nhỉ?

Khẳng định với bạn 2 điều:
- Không thể tối ưu lisp đó được nữa vì nó đã quá tối ưu.
- Lisp này dành để chọn một loạt đối tượng chứ không phải chọn theo cặp.

Tôi cũng đã test, mọi người dùng cũng không sao.

Có 2 khả năng:
1. Mật độ điểm của bạn quá lớn, khoảng cách các điểm quá bé so với kích thước text.
2. Text của bạn Justify không phải là Left.

Bạn có thể upload file của bạn lên diễn đàn được không?
  • 0

#922 cuongtk2

cuongtk2

    biết vẽ ellipse

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

Đã gửi 04 August 2008 - 03:42 PM

C­­­hưa đọc hết đã thấy lỗi ở hàm while rồi.
Cấu trúc của nó là
(while (điều kiện cần để chạy vòng lặp, ở đây là nhập toạ độ điểm)
(biểu thức)
); end while.

Ở đoạn code của bạn mình thấy sau while là luuos, khi giá trị này nil thì vòng lặp mới kết thúc.
Bạn nên để vòng lặp như sau:
(while
(setq p1 (getpoint .....))
(progn
(luuos)
(.....)
(.....)
); end progn
)end while
Như vậy khi nào không nhập điểm nữa thì vòng lặp sẽ kết thúc. Chúc may mắn
  • 0

#923 Arch_Cuong

Arch_Cuong

    biết pan

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

Đã gửi 05 August 2008 - 09:37 AM

Anh Hoành có thể viết cho e mấy lisp thế này đc không :
-Lisp trừ text : Sau khi chọn 2 text để trừ.(text trước là số bị trừ)->chọn điểm đặt in kết quả->in kết quả lên bản vẽ(text style của kết quả giống 2 text kia. có in ra dấu - nếu kết quả âm)
-Lisp tính giá trị trung bình : chọn các text, sau đó chương trình tự nhận biết có bao nhiêu text đã đc chọn và tính giá trị trung bình cho tổng các số đó.->chọn điểm in ra kết quả-> in kết quả lên bản vẽ.
-Lisp chèn text vào 1 text khác : chọn các text cần sửa-> nhập nội dung cần thêm vào-> chương trình sẽ tự động thêm vào trước các text cần sửa các text mà mình vừa nhập nội dung vào.
Cám ơn a rất nhiều . E làm về san nền nên cần mấy thứ này lắm.
  • 0

#924 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 05 August 2008 - 10:24 AM

-Lisp chèn text vào 1 text khác : chọn các text cần sửa-> nhập nội dung cần thêm vào-> chương trình sẽ tự động thêm vào trước các text cần sửa các text mà mình vừa nhập nội dung vào.
Cám ơn a rất nhiều . E làm về san nền nên cần mấy thứ này lắm.

Bạn quay lại trước đây 1 trang mình có cái lisp làm việc này rồi. Cái lisp màu da cam đó bạn
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#925 thangkho

thangkho

    biết vẽ line

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

Đã gửi 05 August 2008 - 12:20 PM

cho em hỏi có lisp nào chuyển Dtext có giá trị dương thành giá trị âm không. ví dụ: 2 chuyển thành -2
  • 0

#926 congdung04

congdung04

    biết vẽ line

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

Đã gửi 05 August 2008 - 03:28 PM

Bạn có thể post yêu cầu về autolisp ở topic này.

bác ơi, cái lệnh trả về kích thước thật của một đường kích thước sau khi bị sửa giá trị là gì ấy nhỉ? em nhớ có lần đọc đc trên diễn đàn như giờ tìm lại không thấy
  • 0

#927 cuongtk2

cuongtk2

    biết vẽ ellipse

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

Đã gửi 05 August 2008 - 03:34 PM

cho em hỏi có lisp nào chuyển Dtext có giá trị dương thành giá trị âm không. ví dụ: 2 chuyển thành -2


Đoạn code sau sẽ giúp đổi số dương thành số âm và ngược lại:
(defun c:so-am ( / ent ent0 noidung)
(while
(setq ent (car (entsel "\n Chon so:")))
(progn
(setq ent0 (entget ent)
noidung (cdr (assoc 1 ent0)))
(if
(= 45 (vl-string-elt noidung 0))
(setq noidung (vl-string-left-trim "-" noidung))
(setq noidung (strcat "-" noidung))
)
(setq ent0 (subst (cons 1 noidung) (assoc 1 ent0) ent0))
(entmod ent0)
(entupd ent)
)))

  • 0

#928 cuongtk2

cuongtk2

    biết vẽ ellipse

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

Đã gửi 05 August 2008 - 03:51 PM

bác ơi, cái lệnh trả về kích thước thật của một đường kích thước sau khi bị sửa giá trị là gì ấy nhỉ? em nhớ có lần đọc đc trên diễn đàn như giờ tìm lại không thấy


Cái này nằm trong express->dimention->reset dim text value
  • 1

#929 tuannguyen314169

tuannguyen314169

    biết lệnh ddedit

  • Members
  • PipPipPipPip
  • 297 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 05 August 2008 - 04:31 PM

[quote name='Nguyen Hoanh' date='Aug 4 2008, 01:19 PM' post='26472']
Tại sao nhỉ?

Cho mình hỏi chen ngang một chút; Trong autocard 2008 lệnh slice chỉ cắt được vài đối tượng phải không? Mong các bạn sớm trả lời vì mình sử dụng cắt nhỏ nhiều lần một đối tượng 3dsolid nhưng không được. Cảm ơn
  • 0

#930 ph168xd

ph168xd

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 779 Bài viết
Điểm đánh giá: 309 (khá)

Đã gửi 05 August 2008 - 11:45 PM

Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành
VD. Đang sử dung dim với tỷ lệ 50
Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50
Thanks các Bac nhiều
  • 0

#931 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 06 August 2008 - 07:30 AM

Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành
VD. Đang sử dung dim với tỷ lệ 50
Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50
Thanks các Bac nhiều


Hy vọng là đúng ý bạn.
(command "insert" "cot" (getpoint "\nDiem dat :") (getvar "dimscale") "" (getangle "\nGoc xoay :"))
  • 0

#932 makhongbietnoi

makhongbietnoi

    biết vẽ point

  • Members
  • PipPip
  • 95 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 06 August 2008 - 09:01 AM

Mong bác Hoành và mọi người giúp đỡ.
Tôi muốn có 1 lisp "cộng" thêm vào các số đã có 1 số nào đó. Kết quả cho sẽ thay thế luôn dãy số cũ. Ví dụ: tôi đang tính khối lượng đắp nền. có rất nhiều mặt cắt và mỗi mặt cắt có khối lượng khác nhau. Giờ tôi muốn thêm vào 0.5 cho tất cả các khối lượng đó để cho khối lượng dư ra.Làm thủ công từng con số thì sẽ mất rất nhiều thời gian.
Thanks!
  • 0

#933 ducbeohn

ducbeohn

    biết pan

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

Đã gửi 06 August 2008 - 10:07 AM

Bạn ơi!
Mình có một ý tưởng thế này!
Mình đang cần một lisp tính tổng chiều dài các đoạn thẳng theo từng layer.
ví dụ: Mình có khoảng 10 layer (IF1 --> IF10), trên bản vẽ, mình đã vẽ rất nhiều đoạn Poly line theo từng layer đó. Bây giờ mình muốn tính tổng chiều dài các đoạn thẳng này và đưa ra kết quả dưới dạng bảng trong cad (hoặc trong Excel thì càng tốt).
Các bạn có thể giúp mình được không?
Thanks trước nhé!
  • 0

#934 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 06 August 2008 - 10:15 AM

Mong bác Hoành và mọi người giúp đỡ.
Tôi muốn có 1 lisp "cộng" thêm vào các số đã có 1 số nào đó. Kết quả cho sẽ thay thế luôn dãy số cũ. Ví dụ: tôi đang tính khối lượng đắp nền. có rất nhiều mặt cắt và mỗi mặt cắt có khối lượng khác nhau. Giờ tôi muốn thêm vào 0.5 cho tất cả các khối lượng đó để cho khối lượng dư ra.Làm thủ công từng con số thì sẽ mất rất nhiều thời gian.
Thanks!


Bạn dùng thử đoạn code này xem sao.
(defun C:0+ (/ a ss obj obj_ent nd i)
(setq a (getreal "\nLuong bien doi :")
n (getint "\nSo chu so thap phan :"))
; So chu so thap phan cua k/qua, vd 123,567 thi nhap 3
(setq ss (ssget (list (cons 0 "TEXT")))
i 0
)
(repeat (sslength ss)
(setq obj (ssname ss i)
obj_ent (entget obj)
nd (cdr (assoc 1 obj_ent))
nd (+ (atof nd) a)
nd (rtos nd 2 n)
i (+ 1 i)
)
(setq obj_ent (subst (cons 1 nd) (assoc 1 obj_ent) obj_ent))
(entmod obj_ent)
)
(princ)
)

  • 0

#935 makhongbietnoi

makhongbietnoi

    biết vẽ point

  • Members
  • PipPip
  • 95 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 06 August 2008 - 10:20 AM

Cảm ơn bạn nhiều! Chúc 1 ngày làm việc tốt!
  • 0

#936 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 06 August 2008 - 10:31 AM

Bạn dùng thử đoạn code này xem sao.

(defun C:0+ (/ a ss obj obj_ent nd i)
(setq a (getreal "\nLuong bien doi :")
n (getint "\nSo chu so thap phan :"))
; So chu so thap phan cua k/qua, vd 123,567 thi nhap 3
(setq ss (ssget (list (cons 0 "TEXT")))
i 0
)
(repeat (sslength ss)
(setq obj (ssname ss i)
obj_ent (entget obj)
nd (cdr (assoc 1 obj_ent))
[b][color="#FF0000"]nd (+ (atof nd) a)[/color][/b]
nd (rtos nd 2 n)
i (+ 1 i)
)
(setq obj_ent (subst (cons 1 nd) (assoc 1 obj_ent) obj_ent))
(entmod obj_ent)
)
(princ)
)



Nếu ở trên không là một số mà là một chuỗi ký tự thì nó ra cái gì vậy bạn
  • 0

#937 Snowman

Snowman

    biết lệnh mirror

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

Đã gửi 06 August 2008 - 10:36 AM

Mong bác Hoành và mọi người giúp đỡ.
Tôi muốn có 1 lisp "cộng" thêm vào các số đã có 1 số nào đó. Kết quả cho sẽ thay thế luôn dãy số cũ. Ví dụ: tôi đang tính khối lượng đắp nền. có rất nhiều mặt cắt và mỗi mặt cắt có khối lượng khác nhau. Giờ tôi muốn thêm vào 0.5 cho tất cả các khối lượng đó để cho khối lượng dư ra.Làm thủ công từng con số thì sẽ mất rất nhiều thời gian.
Thanks!

Đây là lisp bạn cần
Lệnh addi : cộng thêm giá trị cho hàng loạt các số nguyên
addr : cộng thêm giá trị cho hàng loạt các số thực (cái này bạn đang cần)
addt : cộng thêm giá trị cho các text số thứ tự
adde : cộng thêm giá trị cho các text cao độ (có thêm dấu +, -)

(defun myerror (s)
(cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
)
(setvar "cmdecho" CMD) ; Restore saved modes
(setvar "osmode" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(princ)
)

(defun bocchu (ss1 c)
(setq ob (entget (ssname ss1 c)))
(setq ts (assoc 1 ob))
(setq a (cdr ts))
)
(defun sothanhchu (num) (rtos num 2 2))
(defun connumint (num) (rtos num 2 0))
(defun thaychu (Ob newstr)
(setq txtstr (assoc 1 Ob))
(setq newstr (cons 1 newstr))
(entmod (subst newstr txtstr Ob))

)
(defun chonchu (dongnhac)
(prompt dongnhac)
(ssget
'((-4 . "<OR") (0 . "text") (0 . "mtext") (-4 . "OR>"))
)
)
(defun chon (str) (ssget '((cons (0 str)))))
(defun bamchon (st) (entget (car (entsel st))))
(defun bocdt (ss1 c) (entget (ssname ss1 c)))

;;; Sua nhieu text (cong tru gia tri nguyen)
(defun c:addi ()
(command "undo" "mark")
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
(if (= Ostr nil)
(setq Ostr "\nNhap gia tri tang them <>...: ")
)

(while (= ss1 nil)
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
)

(setq i 0
num2 (getint Ostr)
sslen (sslength ss1)
)
(if (/= num2 nil)
(setq
numadd num2
)
)
(if (/= numadd nil)
(setq Ostr (strcat "\nNhap gia tri tang them <"
(rtos numadd 2 0)
"> : "
)
)
)

(while (<= i (1- sslen))
(setq num1 (atof (bocchu ss1 i))

)
(setq num (+ num1 numadd))
(setq ob (bocdt ss1 i))
(setq st (connumint num))

(thaychu ob st)
(princ)

(setq i (1+ i))
)
)


;;; Sua nhieu text (cong tru gia tri)
(defun c:addr ()
(command "undo" "mark")
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
(if (= Ostr nil)
(setq Ostr "\nNhap gia tri tang them <>...: ")
)

(while (= ss1 nil)
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
)

(setq i 0
num2 (getreal Ostr)
sslen (sslength ss1)
)
(if (/= num2 nil)
(setq
numadd num2
)
)
(if (/= numadd nil)
(setq Ostr (strcat "\nNhap gia tri tang them <"
(rtos numadd 2 2)
"> : "
)
)
)

(while (<= i (1- sslen))
(setq num1 (atof (bocchu ss1 i))

)
(setq num (+ num1 numadd))
(setq ob (bocdt ss1 i))

(setq st (sothanhchu num))


(thaychu ob st)
(princ)

(setq i (1+ i))
)
)

;;; Sua nhieu text (cong tru gia tri nguyen - So thu tu)
(defun c:addt ()
(command "undo" "mark")
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
(if (= Ostr nil)
(setq Ostr "\nNhap gia tri tang them <>...: ")
)

(while (= ss1 nil)
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
)

(setq i 0
num2 (getint Ostr)
sslen (sslength ss1)
)
(if (/= num2 nil)
(setq
numadd num2
)
)
(if (/= numadd nil)
(setq Ostr (strcat "\nNhap gia tri tang them <"
(rtos numadd 2 0)
"> : "
)
)
)

(while (<= i (1- sslen))
(setq num1 (atof (bocchu ss1 i))

)
(setq num (+ num1 numadd))
(setq ob (bocdt ss1 i))
(if (< num 10)
(setq st (strcat "0" (connumint num)))
(setq st (connumint num))
)

(thaychu ob st)
(princ)

(setq i (1+ i))
)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Tang giam gia tri cao do
(defun c:adde ()
(command "undo" "mark")
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
(if (= Ostr nil)
(setq Ostr "\nNhap gia tri tang them <>...: ")
)

(while (= ss1 nil)
(setq ss1 (chonchu "\nChon gia tri can cong them ...")
)
)

(setq i 0
num2 (getreal Ostr)
sslen (sslength ss1)
)
(if (/= num2 nil)
(setq
numadd num2
)
)
(if (/= numadd nil)
(setq Ostr (strcat "\nNhap gia tri tang them <"
(rtos numadd 2 2)
"> : "
)
)
)

(while (<= i (1- sslen))
(setq num1 (atof (bocchu ss1 i))

)
(setq num (+ num1 numadd))
(setq ob (bocdt ss1 i))
(if (> num 0)
(setq st (strcat "+" (sothanhchu num)))
(setq st (sothanhchu num))
)

(thaychu ob st)
(princ)

(setq i (1+ i))
)
)

;;;

Với đoạn code như thế này, các bạn hoàn toàn có thể tự chế biến cho mình những công cụ phù hợp, chẳng hạn thay cộng , trừ thành nhân, chia, thêm ký tự vào kết quả .... Mình thấy một số yêu cầu ..na ná nhau như : đánh số nhà, biến số - thành +, hay thêm bớt ký tự vào text ... làm loãng cả nội dung của box, mọi người cũng khó khăn trong việc tìm kiếm. Các mod có nên lập ra các box phân loại lisp theo công dụng và đối tượng không nhỉ (ví dụ như box lisp for text, text style, box lisp for block, box lisp for dim, box lisp for print...
  • 1

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi


#938 Snowman

Snowman

    biết lệnh mirror

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

Đã gửi 06 August 2008 - 10:41 AM

Nếu ở trên không là một số mà là một chuỗi ký tự thì nó ra cái gì vậy bạn

Chết thật, đang type thì đã có bác post trước rồi :s_big:
Bác vndesperados ạ, hàm atof, hay rtos ko được thông minh lắm đâu, nếu gặp tham số là chuỗi ký tự thì nó trả về giá trị 0 chứ ko gây lỗi đâu
  • 0

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi


#939 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 06 August 2008 - 10:47 AM

Chết thật, đang type thì đã có bác post trước rồi :s_big:
Bác vndesperados ạ, hàm atof, hay rtos ko được thông minh lắm đâu, nếu gặp tham số là chuỗi ký tự thì nó trả về giá trị 0 chứ ko gây lỗi đâu



Tôi biết chuyện đó bạn ạh, nhưng như thế thì cũng gây ra một sự thay đổi không đúng theo mong muốn của người dùng rùi. Theo tôi nên có thểm một hàm kiểm tra là số hay chuỗi ký tự trước khi thực hiện thay đổi
  • 0

#940 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 06 August 2008 - 10:50 AM

Tôi biết chuyện đó bạn ạh, nhưng như thế thì cũng gây ra một sự thay đổi không đúng theo mong muốn của người dùng rùi. Theo tôi nên có thểm một hàm kiểm tra là số hay chuỗi ký tự trước khi thực hiện thay đổi



Cám ơn vndesperados và Snowman đã phát hiện lỗi.
  • 0