Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
leo9693

[ Sửa giúp lisp ] Lisp đánh số

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

leo9693    0

Chào các bác,

Em xin được lisp đánh số thứ tự.

-Lisp này nhập số ban đầu, sau đó nó tự động nhảy số theo thứ tự tăng dần, mỗi số được đặt trong 1 vòng tròn và 1 mũi tên chỉ đến điểm mà nó biểu thị.

- Các bác có thể sửa lại giúp em: 

 +  Hiện tại số đánh hiển thị theo dạng "x" (vd: 1,2,3....,100,...). Em muốn hiển thị theo dạng "xxx" (vd: 001,002,003,...,100,...)

 + Thay hình tròn bằng 1 hình chữ nhật 

Mong các bác giúp đỡ. Thank các bác nhiều.

(defun C:mt( / cc,in,ls)

    (setvar "CECOLOR" "Cyan")
   (setvar "dimASZ" 2)
   (setvar "dimASO" 0)
  
(setq in(getint "\n Choose the first of joint weld : "))
  (While
     
  (setq cc (getpoint "\n Specify center point for circle ")
ls (getpoint "\ Choose point on joint ")
)
  
        (command ".CIRCLE" cc "d" 5.5);
(command ".text" "M" cc 2.2 0 in)
   (setq q2 (polar  ls  (angle ls cc);
(- (distance ls cc) 2.75)
 ))
  
(command     "qleader" ls q2 nil)

  ^C ^C;
 (setq in (+ 1 in))

  )
  (setvar "CECOLOR" "bylayer");
);

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

tặng bạn, mình thêm phần nhập text hight:

(defun C:mt( / cc in ls chuoi in_so num_zero dai p1 p2 q2 cao_chu)
   (setvar "CECOLOR" "Cyan")
   (setvar "dimASZ" 2)
   (setvar "dimASO" 0)
	(setq in (getstring "\nChoose the first number : ")
	)
(initget (+ 2 4))
(or #cao_chu (setq #cao_chu 2.2))
(setq cao_chu (getreal (strcat "\nEnter Text Height <" (rtos #cao_chu 2 2) " >:"))
)
(if (not cao_chu) (setq cao_chu #cao_chu) (setq #cao_chu cao_chu))

  (While     
  (setq cc (getpoint "\nSpecify center point for rectang: ")
		ls (getpoint cc "\nChoose point on joint ")
		dai (+ (strlen in) 2)
		p1 (list (- (car cc) (* 0.75 dai)) (+ (cadr cc)  (* 0.75 cao_chu)))
		p2 (list (+ (car cc) (* 0.75 dai)) (- (cadr cc) (* 0.75 cao_chu)) )
	)
  
;  (command ".CIRCLE" cc "d" 5.5)
  (command ".rectang" "non" p1 "non" p2)
  (command ".text" "M" cc cao_chu 0 in)
  (setq q2 (polar  ls  (angle ls cc) (- (distance ls cc) cao_chu)))
; (set q2 (list (car cc) (- (cadr cc) (* 0.75 cao_chu) ) ))
  
(command     "qleader" ls q2 nil)

  ^C ^C;
  
 (setq 	in_so (read in)
		in_so (+ 1 in_so)
		num_zero (- (strlen in) (strlen (itoa in_so)))
		chuoi ""
  )

  (if 	(> num_zero 0)
		 (repeat num_zero
		 (setq chuoi (strcat chuoi "0"))
		 )
				
   )
   (setq in (strcat chuoi (itoa in_so)))
    ); end while
  (setvar "CECOLOR" "bylayer");
);

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

chuẩn:

(defun C:mt( / cc in ls chuoi in_so num_zero dai p1 p2 q2 cao_chu)
   (setvar "CECOLOR" "Cyan")
   (setvar "dimASZ" 2)
   (setvar "dimASO" 0)
	(setq in (getstring "\nChoose the first number : ")
	)
(initget (+ 2 4))
(or #cao_chu (setq #cao_chu 2.2))
(setq cao_chu (getreal (strcat "\nEnter Text Height <" (rtos #cao_chu 2 2) " >:"))
)
(if (not cao_chu) (setq cao_chu #cao_chu) (setq #cao_chu cao_chu))

  (While     
  (setq cc (getpoint "\nSpecify center point for rectang: ")
		ls (getpoint cc "\nChoose point on joint ")
		dai (+ (strlen in) 2)
		p1 (list (- (car cc) (* 0.4 dai cao_chu)) (+ (cadr cc)  (* 0.75 cao_chu)))
		p2 (list (+ (car cc) (* 0.4 dai cao_chu)) (- (cadr cc) (* 0.75 cao_chu)) )
	)
  
;  (command ".CIRCLE" cc "d" 5.5)
  (command ".rectang" "non" p1 "non" p2)
  (command ".text" "M" cc cao_chu 0 in)
  (setq q2 (polar  ls  (angle ls cc) (- (distance ls cc) cao_chu)))
; (set q2 (list (car cc) (- (cadr cc) (* 0.75 cao_chu) ) ))
  
(command     "qleader" ls q2 nil)

  ^C ^C;
  
 (setq 	in_so (read in)
		in_so (+ 1 in_so)
		num_zero (- (strlen in) (strlen (itoa in_so)))
		chuoi ""
  )

  (if 	(> num_zero 0)
		 (repeat num_zero
		 (setq chuoi (strcat chuoi "0"))
		 )
				
   )
   (setq in (strcat chuoi (itoa in_so)))
    ); end while
  (setvar "CECOLOR" "bylayer");
);
  • 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
pphung183    425

 

 +  Hiện tại số đánh hiển thị theo dạng "x" (vd: 1,2,3....,100,...). Em muốn hiển thị theo dạng "xxx" (vd: 001,002,003,...,100,...)

 

Thêm đoạn Code này vào vòng lập While Lisp của trinhhoanghieu090 sẽ được như ý :)

(cond ((< (atoi in) 10) (setq nd (strcat "00" in)) ) ((and (>= (atoi in) 10) (< (atoi in) 100)) (setq nd (strcat "0" in))) ((>= (atoi in) 100) (setq nd (strcat in))) )

sữa (command ".text" "M" cc cao_chu 0 in) thành (command ".text" "M" cc cao_chu 0 nd)

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

Híc, bác pphung không cần thêm thế đâu. Chỉ cần lúc nhập số bắt đầu là dạng có số 0 đằng trước là nó tự hiểu. Ví dụ muốn 2 số 0_thì gõ 001, 2 số thì gõ 01, nhiều hơn nữa 00000001 nó cũng hiểu....

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
pphung183    425

Híc, bác pphung không cần thêm thế đâu. Chỉ cần lúc nhập số bắt đầu là dạng có số 0 đằng trước là nó tự hiểu. Ví dụ muốn 2 số 0_thì gõ 001, 2 số thì gõ 01, nhiều hơn nữa 00000001 nó cũng hiểu....

Hehehe, rảnh rổi ngồi Test thì thấy Lisp có Vài chỗ không ổn :

1/ Dùng hàm getstring mà bảo nhập số là không nên, lở gỏ kí hiệu bất kì nào thì sao? (Cho dù mục đích bạn sử dụng chuỗi là số nhập để xử lí về sau)

2/ Khi bảo nhập số thì chắc là user chỉ cắm đầu nhâp số chứ chẳng lẻ ai cũng hĩu là phải nhập 01 or 001, ... và ý chủ thớt chắc cũng là Nhập thẳng 1 số là ra thẳng 00x, 0xx, xxx :D

3/ Nên thiết lập điều kiện vong lặp While để khi Enter kết thúc không bị báo lỗi.

4/ Không nên set biến hệ thống lung tung rồi không trả về trạng thái cũ cho 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

Hehehe, rảnh rổi ngồi Test thì thấy Lisp có Vài chỗ không ổn :

1/ Dùng hàm getstring mà bảo nhập số là không nên, lở gỏ kí hiệu bất kì nào thì sao? (Cho dù mục đích bạn sử dụng chuỗi là số nhập để xử lí về sau)

2/ Khi bảo nhập số thì chắc là user chỉ cắm đầu nhâp số chứ chẳng lẻ ai cũng hĩu là phải nhập 01 or 001, ... và ý chủ thớt chắc cũng là Nhập thẳng 1 số là ra thẳng 00x, 0xx, xxx :D

3/ Nên thiết lập điều kiện vong lặp While để khi Enter kết thúc không bị báo lỗi.

4/ Không nên set biến hệ thống lung tung rồi không trả về trạng thái cũ cho nó :)

Hè hè, 2 cái số 1/ và 2/ là do em cố tình viết để về một ngày sau này chủ thớt không viết thêm vào cái topic này yêu cầu  "bác ơi sửa lại cho em cái lisp nhập theo kiểu 001,002,...100 thành xxxxx1 ...1000xxx". Tác dụng cua no to lớn mà tac dung phu cua no khong dang lo ngai. Neu Bác có kế sách nào vẹn toàn hon thì chia sẻ để em học hỏi.

Cái số 3 và số 4 đúng là do còn tồn tại từ lisp gốc, tiện thể em update lên đây cái lisp vừa sửa cho nó trực quan hơn, nếu bác có hứng thì làm cho em nó trở nên hoàn hảo. :D

(defun C:mt( / cc in ls in_so num_zero dai p1 p2 q2 cao_chu)
   (setvar "CECOLOR" "Cyan")
   (setvar "dimASZ" 2)
   (setvar "dimASO" 0)
	(setq in (getstring "\nChoose the first number : ")
	)
(initget (+ 2 4))
(or #cao_chu (setq #cao_chu 2.2))
(setq cao_chu (getreal (strcat "\nEnter Text Height <" (rtos #cao_chu 2 2) " >:"))
)
(if (not cao_chu) (setq cao_chu #cao_chu) (setq #cao_chu cao_chu))

  (While     
  (setq cc (getpoint "\nSpecify center point for rectang: ")
		dai (+ (strlen in) 1)
		p1 (list (- (car cc) (* 0.38 dai cao_chu)) (+ (cadr cc)  (* 0.75 cao_chu)))
		p2 (list (+ (car cc) (* 0.38 dai cao_chu)) (- (cadr cc) (* 0.75 cao_chu)) )
	)
  
	(command ".rectang" "non" p1 "non" p2)
	(command ".text" "M" "NON" cc cao_chu 0 in)
  
	(setq
		q2 (list (car cc) (- (cadr cc) (* 0.75 cao_chu) ) )
		ls (getpoint q2 "\nChoose point on joint ")
	)
	(command     "qleader" ls q2 nil)

  ^C ^C;
  
 (setq 	in_so (read in)
		in_so (itoa (+ 1 in_so))
		num_zero (- (strlen in) (strlen in_so))
  )

  (if 	(> num_zero 0)
		 (repeat num_zero
		 (setq in_so (strcat "0" in_so))
		 )
		 				
   )
   (setq in in_so)
    ); end while
  (setvar "CECOLOR" "bylayer");
);
  • 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
nhoclangbat    382

- nhoc xin góp vui tý thêm 1 phương án cho chủ pic ^^


(defun C:mt( / cc in ls dai p1 p2 q2 cao_chu lstp)
(vl-load-com)
;================================================================
 ;==================================================================
(setq clr (getvar 'cecolor)  echo (getvar 'cmdecho))
   (setvar "CECOLOR" "Cyan")
     (setvar 'cmdecho 0)
	(setq in (getvalue in 1  "Choose the first number ")
	)
(setq cao_chu (getvalue cao_chu 2.2 "Nhap chieu cao text "))


  (While  (/= (setq cc (getpoint "\nSpecify center point for rectang: "))  nil) 
	
	(command ".text" "M" "NON" cc cao_chu 0 (them0 (itoa in)))
	(setq lstp (vla-getBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (entlast))))) 'minp 'maxp))
	(setq p1 (mapcar '+ (vlax-safearray->list minp) '(-0.35 -0.35 0.0)))
    (setq p2 (mapcar '+ (vlax-safearray->list maxp)  '(0.35 0.35 0.0)))
    (command ".rectang" "non" p1 "non" p2)
	(setq
		q2 (list (car cc) (- (cadr cc) (* 0.75 cao_chu)))
		ls (getpoint q2 "\nChoose point on joint ")        
	)
	(command     "qleader" ls q2 nil)

  ^C ^C;
 (setq in  (1+ in)) 
 
    ); end while
 (setvar "CECOLOR" clr)
    (setvar 'cmdecho echo)
  (princ)
);
; ham luu gia tri
(defun getvalue ( a giatri dongnhac / astr) 
(or a (setq a giatri))
(cond
	((= (type a) 'INT) (setq a (cond ((getint (strcat "\n" dongnhac "(" (itoa a) ") :")))(a))))
	((= (type a) 'REAL) (setq a (cond ((getreal (strcat "\n" dongnhac "(" (rtos a 2 2) ") :")))(a))))
	((= (type a) 'STR) (setq a (cond ((= "" (setq astr (getstring 1 (strcat "\n" dongnhac " (" a "): ")))) a) (astr))))
))
;;;;
(defun them0(chuoi)
  (setq len (strlen chuoi))
  (if (= len 1)
    (strcat "00" chuoi)
    (if (= len 2)
      (strcat "0" chuoi)
      chuoi
    )  
  )
 )
  • 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
pphung183    425

Đơn giản dễ hiểu và dân dã thôi :)

(defun C:mt( / oldCe in cc dai p1 p2 nd q2 ls cao_chu)
(setq oldCe (getvar "CECOLOR")) (setvar "CECOLOR" "Cyan")
(initget 1)	(setq in (getint "\nChoose the first number : "))
(initget (+ 2 4))
(or #cao_chu (setq #cao_chu 2.2))
(setq cao_chu (getreal (strcat "\nEnter Text Height <" (rtos #cao_chu 2 2) " >:"))
)
(if (not cao_chu) (setq cao_chu #cao_chu) (setq #cao_chu cao_chu))

  (While  (if (not (setq cc (getpoint "\nSpecify center point for rectang: "))) (alert "\nXong!")
(progn	(setq 	dai (+ (strlen (itoa in)) 2)
		p1 (list (- (car cc) (* 0.38 dai cao_chu)) (+ (cadr cc)  (* 0.75 cao_chu)))
		p2 (list (+ (car cc) (* 0.38 dai cao_chu)) (- (cadr cc) (* 0.75 cao_chu)) )
	)
  (cond 
((<= in -100) (setq nd (strcat (itoa in)))) 
((and (> in -100) (<= in -10)) (setq nd (strcat "-0" (itoa (abs in))))) 
((and (> in -10) (< in 0)) (setq nd (strcat "-00" (itoa (abs in))))) 
((and (>= in 0) (< in 10)) (setq nd (strcat "00" (itoa in)))) 
((and (>= in 10) (< in 100)) (setq nd (strcat "0" (itoa in)))) 
((>= in 100) (setq nd (strcat (itoa in)))) )
	(command ".rectang" "non" p1 "non" p2)
	(command ".text" "M" "NON" cc cao_chu 0 nd)
  
	(setq
		q2 (list (car cc) (- (cadr cc) (* 0.75 cao_chu) ) )
		ls (getpoint q2 "\nChoose point on joint ")
	)
	(command     "qleader" ls q2 nil)
(setq in (+ 1 in))
    ))); end while
  (setvar "CECOLOR" oldCe)
(princ))

Ps : Lisp Nhoc nhập -10 thử xem :D

  • 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
pphung183    425

- ^^ aidza` ai lại nhập số âm làm số đếm nhỉ anh Phung ^^

Đôi khi người ta cần Bảng hiệu số cả âm và dương cho một thiết bị nào đó Nhoc ah, nên luong trước mọi trường hợp khả dĩ xảy ra :D

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

Hihi, các bác chắc bị mấy bác lười lười cháo hành nhiều nên giờ phòng xa quá, tính cả đường làm thế nào để không bị hỏi lại.

Đây là 1 lisp nhỏ, ứng dụng cũng 1 phần nhỏ thôi, về cơ bản như bác trinhhoanghieu sửa lúc đầu là giải quyết đc bài toán của em rồi.

Thực ra ngay lúc đầu em cũng có ý kiến như bác pphung183, nhưng vì muốn mày mò thêm nên muốn tự giải quyết. (mặc dù sau mấy ngày thì...chả đâu đến đâu) :wacko: .

Ngâm mấy cái các bác sửa học đc thêm 1 mớ cái.  :wub:  :wub:  :wub:  :wub:  :wub:

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
hiepttr    523

Thấy mấy bạn học xong xáo quá cũng xen vào "xả" vài câu (chỉ võ mồm, ko có code) :D :D :D

- Cái chi cũng lường mà không lường trường hợp text style có set height hay ko ?!

- Nhóc:

   + (While (/= (setq cc (getpoint "\nSpecify center point for rectang: ")) nil)

thi tương đương : (While (setq cc (getpoint "\nSpecify center point for rectang: "))

nên ko cần viết chhi cho dài :D

   + Hàm them0 mình nghĩ để tổng quát hơn thì nên thêm một tham số "chiều dài chuổi đích"

- pphung183:

   Hàm cond nó thịt từ trên xuống nên có thể bỏ hàm AND trong mỗi vế con

 

 p/s: lâu ngày ko biết viết chi nên ngứa ngáy ==> múa rìu qua mặt thợ, xin bỏ quá cho ! :D :D :D

  • 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
nhoclangbat    382

- ^^ lâu ko thấy sư huynh Hiep

- while nhoc biết nhưng lâu lâu quen tay cẩn tắc vô áy náy ^^,them0 nhoc lấy từ ứng dụng khác của nhoc thấy ứng dụng trong lsp này đc nên đưa vào chưa nghĩ xa hơ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
pphung183    425

Thấy mấy bạn học xong xáo quá cũng xen vào "xả" vài câu (chỉ võ mồm, ko có code) :D :D :D

- Cái chi cũng lường mà không lường trường hợp text style có set height hay ko ?!

- pphung183:

   Hàm cond nó thịt từ trên xuống nên có thể bỏ hàm AND trong mỗi vế con

Trường hợp text style có set height hay ko thì vụ này đã nói nhiều trên diễn đàn, các bạn nào chưa kinh nghiệm thì sẽ phải thắc mắc tìm hiểu --> nhớ dai hơn :D

Bỏ hàm AND thì nó vẫn thịt tuốt luốt nhưng mà nó có thịt theo nhu cầu đề ra hay không? :blush:

(command "qleader" ls q2 nil) có thể không như ý khi có bật osmode nên thêm (command "qleader" "non" ls "non" q2 nil)

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
Doan Van Ha    2.677

@pphung183: sự tương đương như sau:

Cũ:

   (cond

    ((<= in -100) (setq nd (strcat (itoa in))))

    ((and (> in -100) (<= in -10)) (setq nd (strcat "-0" (itoa (abs in)))))

    ((and (> in -10) (< in 0)) (setq nd (strcat "-00" (itoa (abs in)))))

    ((and (>= in 0) (< in 10)) (setq nd (strcat "00" (itoa in))))

    ((and (>= in 10) (< in 100)) (setq nd (strcat "0" (itoa in))))

    ((>= in 100) (setq nd (strcat (itoa in)))) )

Mới:

   (cond

    ((<= in -100) (setq nd (strcat (itoa in))))

    ((<= in -10) (setq nd (strcat "-0" (itoa (abs in)))))

    ((< in 0) (setq nd (strcat "-00" (itoa (abs in)))))

    ((< in 10) (setq nd (strcat "00" (itoa in))))

    ((< in 100) (setq nd (strcat "0" (itoa in))))

    (T (setq nd (strcat (itoa in)))) )

  • 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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×