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

Routine tính tổng chiều dài các đối tượng

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

Nhờ sự giúp đỡ của bác Nguyễn Hoành em có viết 1 đoạn code nhằm tính tổng chiều dài của các đối tượng chọn (*Line, Arc, Circle, Elippse). Các bác dùng thử và cho ý kiến.

Một lần nữa xin cảm ơn bác Hoành về sự nhiệt tình giúp đỡ anh em.

Chúc cả nhà luôn vui..

 

(defun add_mline ()
 (foreach e_record_sub	e_record
   (cond ((= 10 (car e_record_sub))
   (setq pt1	   (cdr e_record_sub)
	 mline_len 0.0
   )
  )
  ((= 11 (car e_record_sub))
   (setq pt2	   (cdr e_record_sub)
	 mline_len (+ mline_len (distance pt2 pt1))
	 pt1	   pt2
   )
  )
   )
 )
 (setq tot_len (+ tot_len mline_len))
 (ssdel e_name ss)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun C:tg (/ tot_len ss e_name e_record e_type)
 (setq tot_len 0.0)
 (setq ss (ssget))
 (if (null ss)
   (exit)
 )
 (while (> (sslength ss) 0)
   (setq e_name (ssname ss 0))
   (setq e_record (entget e_name))
   (setq e_type (cdr (assoc '0 e_record)))
   (cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
   (command "lengthen" e_name "")
   (setq tot_len (+ tot_len (getvar "PERIMETER")))
   (ssdel e_name ss)
  )
  ((wcmatch e_type "MLINE") (add_mline))
  (e_type (ssdel e_name ss))
   )
 )
 (prompt (strcat "\nTotal length is: " (rtos tot_len 2 2)))
 (princ)
)

  • 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

http://www.cadviet.com/upfiles/Calline_1.zip

 

Đây là link của chương trìn đã compile.

Trong lúc chờ vợ về ăn cơm, viết cái này tặng Bommak nè:

Cái này thì chẳng chuyên nghiệp đâu, cũng chẳng sáng tạo, cần cù một chút là OK:

 

Chuong trinh tinh tong chieu dai cac object - file LISP

;Form chuong trinh va cac thao tac
(DEFUN CALLINE(/ DCL_ID_CALLINE cd_temp ID_ha ss)  
 (setq DCL_ID_CALLINE (load_dialog "CALLINE.DCL"))
 (if (not(new_dialog "CALLINE" DCL_ID_CALLINE)) (exit))  
 (start_list "La_CL")  
 (mapcar 'add_list LiLa)
 (end_list)  
 (Setvalue_CL)
 (action_tile "Sele_CL" "(Getvalue_CL) (done_dialog 2)")
 (action_tile "Info" "(ABOUT)")
 (action_tile "ChkLa_CL" "(IsChkLa_CL)")
 (setq RES (start_dialog))  
 (if (= RES 2)
(progn	  
  (prompt "Chon doi tuong:")
  (setq la_name (LANAME LiLa (atoi la_CL)))	 
  (if (= chk_CL "1")	
(setq ss (ssget (List (cons 8 la_name))))
(setq ss (ssget))
  )
  (if (/= ss Nil)
(progn
  (setq n (sslength ss))
	  (setq i 0)
	  (While (< i n)
		(setq dt (ssname ss i))
	(if (OR (= (TENDOITUONG dt) "LINE")
			(= (TENDOITUONG dt) "LWPOLYLINE")
							(= (TENDOITUONG dt) "POLYLINE")
			(= (TENDOITUONG dt) "SPLINE")
			(= (TENDOITUONG dt) "ARC")
			(= (TENDOITUONG dt) "CIRCLE"))
	  (progn	  
		(setq ID_ha (ID_HANDLE dt))
		(if (IsNotExist ID_ha)
		  (progn		
			(setq List_obj (Append List_obj (List ID_ha)))
			(setq cd_temp (CDAIOBJ dt))
			(setq chieudai_CL (+ chieudai_CL cd_temp))
		  )
		  (alert "Doi tuong nay da duoc chon")
		)	  
	  )
	)  
		(setq i (+ 1 i))					   
	  )
)  
(alert "Khong co doi tuong nao duoc chon!")
  )
  (CALLINE)
)
 )  
 (unload_dialog DCL_ID_CALLINE) 
)
;Khoi dong
(DEFUN CALINIT()
 (CREALILA)
 (if (Null La_CL)
(setq la_CL "0")
 )  
 (setq chieudai_CL 0)
 (if (Null chk_CL)
(setq chk_CL "0")
 )
 (setq List_obj Nil)
)
;Cai dat cac gia tri
(DEFUN Setvalue_CL()
 (set_tile "L_CL" (rtos chieudai_CL 2 2))
 (set_tile "La_CL" la_CL)
 (set_tile "ChkLa_CL" chk_CL)
 (IsChkLa_CL)
)
;Nhan gia tri
(DEFUN Getvalue_CL()
 (setq chk_CL (get_tile "ChkLa_CL"))
 (setq chieudai (atof (get_tile "L_CL")))
 (setq la_CL (get_tile "La_CL"))
)
;Nhan handle
(DEFUN ID_HANDLE (obj / idha)
 (setq idha (CDR (ASSOC 5 (ENTGET obj))))  
 idha
)
;Thay doi trang thai
(DEFUN IsChkLa_CL ()
 (if (= (get_tile "ChkLa_CL") "1")
(mode_tile "La_CL" 0)
(mode_tile "La_CL" 1)
 )
)
;Kiem tra ton tai
(DEFUN IsNotExist (id / l in IsOK id_temp)
 (setq IsOK T)
 (setq l (length List_obj))
 (If (= l 0)
(setq IsOK T)
(progn
  (setq in 0)
  (while (< in l)
(setq id_temp (nth in List_obj))
(If (= id id_temp)
  (setq IsOK Nil)
)
(setq in (1+ in))
  )
)
 )
 IsOK
)
;Ham thong tin
(DEFUN ABOUT(/ DCL_ID_ABOUT)
 (setq DCL_ID_ABOUT (load_dialog "CALLINE.DCL"))
 (if (not(new_dialog "ABOUT" DCL_ID_ABOUT))(exit))  
 (start_list "aboutme")
 (add_list " ")  
 (add_list "  VO KIEN CUONG - Bachelor of IT")
 (add_list "  =====================================================")
 (add_list "  Email : vkcuong_23@yahoo.com")
 (add_list "  Mobile: 0983616182 - 0977352125")
 (add_list "  CAD developer (LISP, DCL, VBA for AutoCad, ObjectARX...)")  
 (add_list "  ")
 (end_list)
 (start_dialog)
 (unload_dialog DCL_ID_ABOUT)
)
;Ham thuc thi chuong trinh
(DEFUN C:CL()
 (setvar "CMDECHO" 0)
 (CALINIT)  
 (CALLINE)
 (setvar "CMDECHO" 1)
)
;Ham lai chieu dai
(DEFUN CDAIOBJ(obj / cdai)
 (command "LENGTHEN" obj "")
 (setq cdai (getvar "PERIMETER"))
 cdai
)
;ham lay ten doi tuong
(DEFUN TENDOITUONG (obj / name)
 (setq name (CDR (ASSOC 0 (ENTGET obj))))  
 name  
)
;Ham tao danh sach layer
(DEFUN CREALILA (/ NL)
 (setq LiLa (List))
 (setq NL (tblnext "LAYER" T))  
 (while NL	
(setq LiLa (append LiLa (list (cdr (assoc 2 NL)))))
(setq NL (tblnext "LAYER"))
 )
 (setq LiLa (Acad_strlsort LiLa))
)
;Ham lay layer
(DEFUN LANAME(LiLa index / la)
 (setq la (nth index LiLa))
 la
)

 

Chuong trinh tinh tong chieu dai cac object - file DCL

//Form tinh chieu dai cua PolyLine
CALLINE:dialog	{
label="Calculation Line - Free Ware";
:edit_box{
	label="Chieu dai (m):";
	key="L_CL";
	}
:toggle	{
	label="Khoa Layer";
	key="ChkLa_CL";		
 	}
:popup_list{
	label="Layer:";
	key="La_CL";
	is_enabled="0";
	}
:row	{
	:button	{
		label="Chon doi tuong";
		key="Sele_CL";		
		}
	:button {
		label="Info..";
		key="Info";
		}
	}
ok_only;
	}
ABOUT:dialog{
label="About me...";
spacer_1;
:list_box{				
	key="aboutme";
	width=55;
	height=9;
	}
ok_only;
}

  • 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
đoạn mã: (wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")

rất hay.

Cảm ơn bác đã động viên. Em sẽ cố gắng hơn nữ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
Đây là link của chương trìn đã compile.

Trong lúc chờ vợ về ăn cơm, viết cái này tặng Bommak nè:

Cái này thì chẳng chuyên nghiệp đâu, cũng chẳng sáng tạo, cần cù một chút là OK:

 

Em rất cảm ơn bác đã tặng em phần phần mềm cực hay. Đúng là cách giải quyết vấn đề của Developer có khác, rất chuyên nghiệp bác ạ. Cái đoạn ngắn tẹo của em mà em cũng phải hỏi bác Hoành 2 lần cộng với 2 tiếng loay hoay mới xong (em nói thật). Em sẽ nghiên cứu đoạn code bác mở tặng anh em, chắc chắn sẽ học được nhiều thủ thuật thú vị. Em cũng hi vọng đến lúc nào đó sẽ có thể bắt đầu viết các đoạn chương trình có GUI như các bác. Bấy giờ em cứ học Lisp cho nó có căn bản đã. DCL thì đành để dành sau vậy... chứ "đam mê" quá chác không còn thời gian kiếm tiền nuôi vợ con mất...

Chúc các bác luôn vui vẻ

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 nhé.

Post chương trình lên mà quên mất cho biết tên lệnh.

Anh em load về rồi dùng lệnh CL nhé

 

Còn hai file ở dưới thì đặt tên như sau:

CALLINE.LSP

CALLINE.DCL

 

Copy cả hai file vào một thư mục trên máy tính (VD: C:\CALLINE)

 

Khởi động AutoCad

Chọn Tools --> Options

Trong Tab Files chọn Support Files Search Path --> Add --> Browse... "chọn thư mục lưu hai file trên (C:\CALLINE)" --> Apply --> OK

Mở file CALLINE.LSP rồi load vào bản vẽ

Gõ lệnh CL là OK

 

Anh em nào cần giải thích gì thì Post lên nhé...

Không biết bác Nguyen Hoanh có hạ cố đọc đọan code này không nhỉ? Chắc là bác ấy giận vì mình nói mọi người sao post lên mà viết "ngô nghê".

Thực ra mình không có ý chê gì, chỉ muốn khi coding hãy tư duy và viết theo một cấu trúc nhìn cho pro một tý để có thể tái sử dụng.

Như trong đọan code mình post lên thì có những đọan thể sử dụng lại hầu như ở bất kỳ chương trình nào vì rất dễ gặp lại:

 

;ham lay ten doi tuong
(DEFUN TENDOITUONG (obj / name)
 (setq name (CDR (ASSOC 0 (ENTGET obj))))  
 name  
)

;Ham tao danh sach layer
(DEFUN CREALILA (/ NL)
 (setq LiLa (List))
 (setq NL (tblnext "LAYER" T))  
 (while NL	
(setq LiLa (append LiLa (list (cdr (assoc 2 NL)))))
(setq NL (tblnext "LAYER"))
 )
 (setq LiLa (Acad_strlsort LiLa))
)

;Ham lay ten layer
(DEFUN LANAME(LiLa index / la)
 (setq la (nth index LiLa))
 la
)

  • 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ừ góc độ người dùng, tôi có nhận xét:

- Trình của bommak đơn giản hơn nhưng hiệu quả hơn vì tính được cả Mline

- Trình của vndesperados màu mè hơn nhưng không có tính năng nà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
Từ góc độ người dùng, tôi có nhận xét:

- Trình của bommak đơn giản hơn nhưng hiệu quả hơn vì tính được cả Mline

- Trình của vndesperados màu mè hơn nhưng không có tính năng này

 

Quan niệm về chiều dài MLINE không giống nhau ở mỗi người. Có người cho rằng chiều dài MLINE là tổng tất cả các chiều dài của LINE thành thần trong MLINE nhưng có người quan niệm khác (như theo tôi chiều dài MLINE chỉ là chiều dài đường "tâm" thôi). Vậy nên tôi không đưa cách tính MLINE vào trong chương trình để mỗi người làm việc theo cách riêng của mình.

 

Kết hợp đọan chương trình của Bommak mỗi người có thể đưa ra một cách tính của riêng mình.

Đó là lý do tôi để ngỏ chương trì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
Quan niệm về chiều dài MLINE không giống nhau ở mỗi người. Có người cho rằng chiều dài MLINE là tổng tất cả các chiều dài của LINE thành thần trong MLINE nhưng có người quan niệm khác (như theo tôi chiều dài MLINE chỉ là chiều dài đường "tâm" thôi). Vậy nên tôi không đưa cách tính MLINE vào trong chương trình để mỗi người làm việc theo cách riêng của mình.

 

Kết hợp đọan chương trình của Bommak mỗi người có thể đưa ra một cách tính của riêng mình.

Đó là lý do tôi để ngỏ chương trình.

 

Em cũng quan niêm chiều dài MLINE là chiều dài đường tâm và cũng tính toán theo cách đó vì em thấy mọi người hay có xu hướng sử dụng Mline để thể hiện 1 đối tượng... (mà thật ra em cũng chưa thử tìm hiểu xem nếu tính tổng các thành phần thì sẽ giải quyết bài toán như thế nào... :s_dead:)

 

Em thấy bác Vndeserados có cách tổ chức rất bài bản. Cách sử dụng các Templete Code của bác là rất đúng, nhưng nhiều khi bon em một phần vừa là newbie một phần vừa amateur nên việc Coding sao cho có "kỷ luật" thì cũng còn cần thời gian và phụ thuộc vào tính cách mỗi người. Dú sao bọn em coding chủ yếu cho công việc bản thân và vì thích thú nên cũng thể tất được phải không bác..

 

Một lần nữa cảm ơn bác vì sự đóng góp nhiệt tì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

(DEFUN PHANTICHLINE (obj / i dt td ListXY)
 (setq ListXY (List))
 (setq i 0)
 (setq dt (entget obj))
 (if (OR (= (TENDOITUONG obj) "LWPOLYLINE" ) (= (TENDOITUONG obj) "MLINE" ) (= (TENDOITUONG obj) "LINE" ))
(progn
  (repeat (length dt)
	(setq ds (nth i dt))
	(if (OR (= (nth 0 ds) 10) (= (nth 0 ds) 11))
  (progn
	(setq td (cdr ds))
	(setq ListXY (append ListXY (List td)))
	  )
	)
	(setq i (1+ i))
  )
)
 )
 ListXY
)

 

Tặng Bommak đọan code này nè. Cái này mà bây giờ bạn cố nghĩ cũng chẳng biết để làm gì đâu. Nhưng mà dùng được đấy.

Nội dung: lấy tất cả các đỉnh của một LINE, PLINE hoặc MLINE...

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

Đoạn mã dưới đây tương đương với đoạn mã của vndesperados, nhưng thuần lisp hơn một chút:

 

(DEFUN PHANTICHLINE (obj / kq pp tt e_type)
 (setq	tt     (entget obj)
e_type (cdr (assoc 0 tt))
 )
 (if (wcmatch e_type "LINE,LWPOLYLINE,MLINE")
   (foreach pp	tt
     (if (member (car pp) '(10 11))
(setq kq (append kq (list (cdr pp))))
     )
   )    
 )
 kq
)

Hy vọng là có thể giúp những người mới viết lisp dễ hiểu hơn một ít.

  • Vote tăng 1
  • Vote giảm 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ảm ơn các bác đã cho em mấy đoạn code mẫu đó. Đúng là em chưa nghĩ ngay đến việc sẽ sử dụng như thế nào, nhưng em biết chắc chắn sẽ rất có ích cho em và những bạn đang làm quen với AutoLISP. Từ trước đến giờ em vẫn học Lisp theo cách đó các bác ạ. Em kiếm những đoạn code sẵn có, rồi cứ thế tra sách xem ý nghĩa các hàm trong đó là gì, cố gắng ghi nhớ và vận dụng vào các bài toán của mình.

Mong học hỏi thêm nhiều từ các bác.

Chúc cả nhà luôn vui vẻ và... đưa ra được lựa chọn sáng suốt cho buổi bầu cử sắp tới :s_dead:

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
Nhờ sự giúp đỡ của bác Nguyễn Hoành em có viết 1 đoạn code nhằm tính tổng chiều dài của các đối tượng chọn (*Line, Arc, Circle, Elippse). Các bác dùng thử và cho ý kiến.

Một lần nữa xin cảm ơn bác Hoành về sự nhiệt tình giúp đỡ anh em.

Chúc cả nhà luôn vui..

 

(defun add_mline ()
 (foreach e_record_sub	e_record
   (cond ((= 10 (car e_record_sub))
   (setq pt1	   (cdr e_record_sub)
	 mline_len 0.0
   )
  )
  ((= 11 (car e_record_sub))
   (setq pt2	   (cdr e_record_sub)
	 mline_len (+ mline_len (distance pt2 pt1))
	 pt1	   pt2
   )
  )
   )
 )
 (setq tot_len (+ tot_len mline_len))
 (ssdel e_name ss)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun C:tg (/ tot_len ss e_name e_record e_type)
 (setq tot_len 0.0)
 (setq ss (ssget))
 (if (null ss)
   (exit)
 )
 (while (> (sslength ss) 0)
   (setq e_name (ssname ss 0))
   (setq e_record (entget e_name))
   (setq e_type (cdr (assoc '0 e_record)))
   (cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
   (command "lengthen" e_name "")
   (setq tot_len (+ tot_len (getvar "PERIMETER")))
   (ssdel e_name ss)
  )
  ((wcmatch e_type "MLINE") (add_mline))
  (e_type (ssdel e_name ss))
   )
 )
 (prompt (strcat "\nTotal length is: " (rtos tot_len 2 2)))
 (princ)
)

đoạn lisp này giúp cho mình thống kê vật liệu đơn giản hơn rất nhiều, cám ơn bạn lắm lắm!

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
Nhờ sự giúp đỡ của bác Nguyễn Hoành em có viết 1 đoạn code nhằm tính tổng chiều dài của các đối tượng chọn (*Line, Arc, Circle, Elippse). Các bác dùng thử và cho ý kiến.

Một lần nữa xin cảm ơn bác Hoành về sự nhiệt tình giúp đỡ anh em.

Chúc cả nhà luôn vui..

 

(defun add_mline ()
 (foreach e_record_sub	e_record
   (cond ((= 10 (car e_record_sub))
   (setq pt1	   (cdr e_record_sub)
	 mline_len 0.0
   )
  )
  ((= 11 (car e_record_sub))
   (setq pt2	   (cdr e_record_sub)
	 mline_len (+ mline_len (distance pt2 pt1))
	 pt1	   pt2
   )
  )
   )
 )
 (setq tot_len (+ tot_len mline_len))
 (ssdel e_name ss)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun C:tg (/ tot_len ss e_name e_record e_type)
 (setq tot_len 0.0)
 (setq ss (ssget))
 (if (null ss)
   (exit)
 )
 (while (> (sslength ss) 0)
   (setq e_name (ssname ss 0))
   (setq e_record (entget e_name))
   (setq e_type (cdr (assoc '0 e_record)))
   (cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
   (command "lengthen" e_name "")
   (setq tot_len (+ tot_len (getvar "PERIMETER")))
   (ssdel e_name ss)
  )
  ((wcmatch e_type "MLINE") (add_mline))
  (e_type (ssdel e_name ss))
   )
 )
 (prompt (strcat "\nTotal length is: " (rtos tot_len 2 2)))
 (princ)
)

Cám ơn bạn với code này. Nhưng mình muốn tính tổng chiều dài tát cả các LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE trong 1 lớp , khi chạy code hỏi " tính cho lớp nào", mình chọn lớp, ra kết quả. Bạn giúp mình nha

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 với code này. Nhưng mình muốn tính tổng chiều dài tát cả các LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE trong 1 lớp , khi chạy code hỏi " tính cho lớp nào", mình chọn lớp, ra kết quả. Bạn giúp mình nha

 

Trong Thread này đã có code làm như bạn yêu cầu rùi. Tại bạn không chịu đọc kỹ đó 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
Cám ơn bạn với code này. Nhưng mình muốn tính tổng chiều dài tát cả các LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE trong 1 lớp , khi chạy code hỏi " tính cho lớp nào", mình chọn lớp, ra kết quả. Bạn giúp mình nha

Tặng bạn một lisp "cực ngắn" theo đúng yêu cầu, tên lệnh là TL. Bạn có thể tuỳ nghi sửa đổi theo ý thích:

;;;--------------------------------------------------------------------
(defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
;;;--------------------------------------------------------------------
(defun C:TL( / Lay ss L e)
(setq
Lay (getstring "\nLayer name:")
ss (ssget "X" (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
	 (cons 8 Lay)))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(alert (strcat "Total length of all objects in layer " Lay " = " (rtos L)))
)
;;;--------------------------------------------------------------------

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ưa bác NguyenHoanh, bạn Boommak và các quý Anh khác trên diễn đàn,

Tôi đã mót cái lisp của bạn về xài rồi, rất cám ơn xong có tí chút xơ bị giắt vào răng. Mong bác Hoành, bạn và các quý anh khác gỡ giùm nhé.

1/- Đoạn mã (cdr (assoc '0 e_record)) tại sao lại phải có dấu ' ở trước số 0 vậy. Tôi có mót được củ Autolisp của ông Jeff Sander thì trong đó không dùng dấu này. Như vậy đoạn mã trên sẽ chỉ là (cdr (assoc 0 e_record)) thôi. Tôi hiểu đoạn mã trên là dùng để lấy cái tên của biến e_record trong list mã DXF của nó. Vậy sự khác nhau của có và không có cái dấu ' đó là gì?

2/- Đoạn mã (wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE") bạn học ở đâu vậy? Tôi muốn bạn và các quý anh khác chỉ giùm chỗ để tôi đến mót về dùng. Hiện tại mót được của bạn rồi nhưng chưa hiểu rõ lắm. Cú pháp của hàm WCMATCH này ra sao? có phải chỉ có duy nhất một cú pháp bạn dùng hay không hay còn có các cú pháp khác nữa? Tôi hiểu nôm na cái cú pháp của bạn là một dạng của hàm OR phải không? Nếu tôi sửa thành (Or e_type "line,arc, circle, polyline, lwpolyline,..... ") thì sẽ có vấn đề gì nhỉ? Nói bậy vậy thôi chứ tôi cũng chửa mót được cái hàm Or ở trong autolisp bao giờ. Đại khái tôi hiểu cái hàm wcmatch của bạn nói rằng khi biến E_type là một trong các giá trị có mặt trong chuỗi bạn mô tả thì .... có phải không?

 

Vì kiến thức về lisp còn lùn quá mong bác NguyenHoanh, bạn và các quý anh khác đừng cười chê nhé. Cái sự mót của tôi còn phải nhờ vả bác Nguyenhoanh, bạn và các quý anh khác trên diễn đàn dài dài.

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
Mong bác Hoành, bạn và các quý anh khác gỡ giùm nhé.

1/- Đoạn mã (cdr (assoc '0 e_record)) tại sao lại phải có dấu ' ở trước số 0 vậy. Tôi có mót được củ Autolisp của ông Jeff Sander thì trong đó không dùng dấu này. Như vậy đoạn mã trên sẽ chỉ là (cdr (assoc 0 e_record)) thôi. Tôi hiểu đoạn mã trên là dùng để lấy cái tên của biến e_record trong list mã DXF của nó. Vậy sự khác nhau của có và không có cái dấu ' đó là gì?

2/- Đoạn mã (wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE") bạn học ở đâu vậy? Tôi muốn bạn và các quý anh khác chỉ giùm chỗ để tôi đến mót về dùng. Hiện tại mót được của bạn rồi nhưng chưa hiểu rõ lắm. Cú pháp của hàm WCMATCH này ra sao? có phải chỉ có duy nhất một cú pháp bạn dùng hay không hay còn có các cú pháp khác nữa? Tôi hiểu nôm na cái cú pháp của bạn là một dạng của hàm OR phải không? Nếu tôi sửa thành (Or e_type "line,arc, circle, polyline, lwpolyline,..... ") thì sẽ có vấn đề gì nhỉ? Nói bậy vậy thôi chứ tôi cũng chửa mót được cái hàm Or ở trong autolisp bao giờ. Đại khái tôi hiểu cái hàm wcmatch của bạn nói rằng khi biến E_type là một trong các giá trị có mặt trong chuỗi bạn mô tả thì .... có phải không?

 

Xin được trả lời bạn:

1/ dấu ' có hay không trong 2 trường hợp trên đều như nhau. Có dấu phẩy thì số 0 được xem như là biến, không có dấu phẩy thì số 0 được xem như là hằng số. Bạn cũng không nên quan tâm đến nó làm gì vì điều đó không cần thiết. Điều những người viết lisp nên biết là có dấu phẩy thì khi chạy, lisp không cần phải sinh ra một ô nhớ trung gian nữa và sẽ chạy nhanh hơn một chút so với khi không có dấu phẩy. That's enough!

 

2/

Hỏi: Đoạn mã (wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE") bạn học ở đâu vậy?

Đáp: Câu hỏi này quá khó nên tôi không trả lời được.

 

Hỏi: Cú pháp của hàm WCMATCH này ra sao?

Đáp: Câu hỏi quá dễ, hàm WCMATCH là hàm rất cơ bản, bạn hãy tự tìm hiểu.

 

Hỏi: có phải chỉ có duy nhất một cú pháp bạn dùng hay không hay còn có các cú pháp khác nữa?

Đáp: Còn nhiều cú pháp khác. Không chỉ trong autolisp, thường thì mọi vấn đề đều có nhiều sắc thái.

 

Hỏi: Tôi hiểu nôm na cái cú pháp của bạn là một dạng của hàm OR phải không?

Đáp: Bạn hiểu nôm na gần đúng.

 

Hỏi: Nếu tôi sửa thành (Or e_type "line,arc, circle, polyline, lwpolyline,..... ") thì sẽ có vấn đề gì nhỉ?

Đáp: Không hề hấn gì, chỉ có điều không liên quan đến mã lệnh wcmatch tẹo nào!

 

Hỏi: Đại khái tôi hiểu cái hàm wcmatch của bạn nói rằng khi biến E_type là một trong các giá trị có mặt trong chuỗi bạn mô tả thì .... có phải không?

Đáp: Bạn hiểu đại khái rất chính xác.

  • 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
1) ... Cú pháp của hàm WCMATCH này ra sao?

2) ...tôi cũng chửa mót được cái hàm Or ở trong autolisp bao giờ.

1) Trích dẫn Help về wcmatch:

 

Syntax

(wcmatch string pattern)

String

A string to be compared. The comparison is case-sensitive, so upper- and lowercase characters must match.

 

Pattern

A string containing the pattern to match against string. The pattern can contain the wild-card pattern-matching characters shown in the table Wild-card characters. You can use commas in a pattern to enter more than one pattern condition. Only the first 500 characters (approximately) of the string and pattern are compared; anything beyond that is ignored.

Both arguments can be either a quoted string or a string variable. It is valid to use variables and values returned from AutoLISP functions for string and pattern values.

Return Values

If string and pattern match, wcmatch returns T, otherwise, wcmatch returns nil.

 

Examples

(wcmatch "phamthanhbinh" "binh") -> nil

(wcmatch "phamthanhbinh" "*binh") -> T

(wcmatch "binh" "pham,thanh,binh") -> T

 

 

2) Hàm or càng đơn giản hơn. Đây là hàm logic, hoàn toàn đồng nhất với khái niệm or trong toán học.

Syntax

(or [expr...])

 

Return Values

T (True) or nil (False)

Examples

(or (> 2 1) (> 2 3)) -> T

(or (< 2 1) (> 2 3)) -> nil

 

 

Bạn hiểu cú pháp và cách dùng các hàm sẽ tự giải đáp được tất cả. Mọi cái đều có trong Help. Mình có nghe bạn từng nói Help khó gặm? Khó cũng phải cố, gặm riết rồi nó cũng... vỡ ra! Bản thân mình (hay bất kỳ ai khác), muốn đi sâu hơn về Lisp (hay bất kỳ món IT nào), đều phải tự rèn luyện kỹ năng đọc Help.

English của mình cũng chẳng giỏi giang gì, nhưng những kiến thức về Lisp mà mình có hiện nay, 80% là mò mẫm từ trong Help. Xin chia sẻ vài kinh nghiệm:

1) Phải biết cách dùng các Tab của Help, đặc biệt là các tab: Contents, Index và Ask Me

2) Luyện kỹ năng đọc lướt văn bản English để biết đoạn này có cái mình quan tâm không?

3) Nếu có, cũng không cần đọc hết mà tìm ngay đến những cái chủ yếu nhất. Ví dụ, bạn cần tra cứu hàm, hãy tìm trước tiên đến Syntax - Arguments - Return Values của nó.

4) Bạn hiểu còn lơ mơ quá? Mặc nó, chuyển ngay xuống các Examples đọc qua một lượt. Sau đó, copy từng dòng code của nó và paste vào Command: của Acad. Bảo đảm bạn sẽ giải toả được mấy cái lơ mơ trên.

5) Bắt chước theo các ví dụ của họ, thay đổi các tham số và xem kết quả Return của Acad. Bạn tự làm được đoạn này trong nhiều trường hợp khác nhau tức là bạn đã... convert được kiến thức từ trong Help vào... cái đầu mình!

 

Chúc bạn "thu hoạch" được nhiều cái có giá trị ngay từ trong Help chứ không cần phải "mót" ở đâu 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

Ới bác NguyenHoanh và quý Anh Boommak,

Lại giắt răng nữa rồi. Hu Hu, nhờ bác và quý anh gỡ giùm.

Sau khi rà kỹ chương trình của quý anh Boommak, tôi thấy đoạn mã (e_type (ssdel e_name ss)) hình như là thừa vì theo như chương trình của quý Anh và những cái tôi mót được thì lisp chả có cái hàm nào mang tên e_type cả. Thực tế tôi đã thử vô hiệu hóa đoạn mã này và xóa cả cái dấu ( ' ) trước số 0 trong đoạn mã (setq e_type (cdr (assoc '0 e_record))) ;(như bài post trước đã đề cập); thì chương trình của quý anh vẫn chạy phà phà, chả có tí dấu hiệu hụt hơi nào.

Vậy là sao nhỉ? Hay là tại cái sự mót của tôi chưa tới nơi tới chốn. Dùng đại cũng được nhưng mà sợ cái sự ngu của mình nó hại đến đời con cháu nên đành phải làm phiền bác NguyenHoanh và quý Anh Boommak. Mong moi người thể tất, đại xá cho.

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
Ới bác NguyenHoanh và quý Anh Boommak,

Lại giắt răng nữa rồi. Hu Hu, nhờ bác và quý anh gỡ giùm.

Sau khi rà kỹ chương trình của quý anh Boommak, tôi thấy đoạn mã (e_type (ssdel e_name ss)) hình như là thừa vì theo như chương trình của quý Anh và những cái tôi mót được thì lisp chả có cái hàm nào mang tên e_type cả. Thực tế tôi đã thử vô hiệu hóa đoạn mã này và xóa cả cái dấu ( ' ) trước số 0 trong đoạn mã (setq e_type (cdr (assoc '0 e_record))) ;(như bài post trước đã đề cập); thì chương trình của quý anh vẫn chạy phà phà, chả có tí dấu hiệu hụt hơi nào.

Vậy là sao nhỉ? Hay là tại cái sự mót của tôi chưa tới nơi tới chốn. Dùng đại cũng được nhưng mà sợ cái sự ngu của mình nó hại đến đời con cháu nên đành phải làm phiền bác NguyenHoanh và quý Anh Boommak. Mong moi người thể tất, đại xá cho.

Bản chất của dòng lệnh đó cũng giống như thắc mắc lần trước của bạn về setvar osmode ấy, nó là một dạng đội mũ bảo hiểm. Không có mũ bảo hiểm thì bạn vẫn chạy phà phà, mỗi tội khi tai nạn xảy ra thì đội mũ tốt hơn là không đội.

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

Ới các bác NguyenHoanh và SSG,

Em cám ơn các bác nhiều vì đã giải thích cho em hiểu nhiều thứ, không chỉ là về lisp. Song bác SSG ạ, em muốn hỏi lại bác là cái Help mà bác nói có phải là của Acad không hay là Help của lisp? Mà Help của lisp thì em chả mò được nó ở đâu. Còn ở trong Acad thì thú thực là em cũng chửa tìm vì mở ra thấy nó như rừng, sợ lạc lối bác ạ. Về hàm or thì em tìm trong help của Acad đâu có thấy.

Các bác thông cảm cho em vì em mới lọ mọ vào lisp được mấy bữa chưa rành đường đi nước bước mà. Nói như dân chơi cờ tướng là "chưa sạch nước cản" ấy. Vì thế mong được các bác động viên nhiều chứ thật tình nhiều lúc cũng thấy mình hỏi ngớ ngẩn làm phiền các bác. Tuy nhiên cái em hỏi là thật sự em không biết chứ chả phải giả ngố đâu, các bác đừng giận. Mọi điều các bác chỉ em đều cố thực hiện cả đấy, hy vọng sẽ dần dần khá lên để các bác đỡ ngán cái đồ học mót nà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

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

×