Rated 5/5 based on 240179 internet user reviews

Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
52 replies to this topic

#1 Bommak

Bommak

    biết vẽ line

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

Đã gửi 18 May 2007 - 08:42 AM

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)
)

  • 1

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 18 May 2007 - 10:52 AM

đoạn mã: (wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
rất hay.
  • 0

#3 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 18 May 2007 - 01:28 PM

[url="http://www.cadviet.com/upfiles/Calline_1.zip"]http://www.cadviet.c...s/Calline_1.zip[/url]

Đâ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;
	}

  • 1

#4 Bommak

Bommak

    biết vẽ line

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

Đã gửi 18 May 2007 - 02:06 PM

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

#5 Bommak

Bommak

    biết vẽ line

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

Đã gửi 18 May 2007 - 02:15 PM

Đâ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ẻ
  • 0

#6 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 18 May 2007 - 03:43 PM

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
)

  • 1

#7 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1070 (rất tốt)

Đã gửi 18 May 2007 - 05:01 PM

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

#8 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 18 May 2007 - 05:44 PM

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

#9 Bommak

Bommak

    biết vẽ line

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

Đã gửi 18 May 2007 - 07:11 PM

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

#10 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 18 May 2007 - 07:34 PM

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

#11 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 19 May 2007 - 12:10 AM

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

#12 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 19 May 2007 - 09:57 PM

Bác Nguyen Hoanh này, làm sao để Post hình ảnh lên đây nhỉ, mình chỉ Post duoc Text thôi
  • 0

#13 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 19 May 2007 - 10:17 PM

Diễn đàn không có chức năng upload ảnh.
Bạn phải dùng photobucket thôi:
http://www.cadviet.com/forum/index.php?sho...mp;st=0#entry86
  • 0

#14 Bommak

Bommak

    biết vẽ line

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

Đã gửi 20 May 2007 - 01:09 AM

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

#15 leduongxd

leduongxd

    Chưa sử dụng CAD

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

Đã gửi 05 June 2007 - 11:13 AM

Cám ơn bác nhé, em tìm cái này mấy tháng nay rồi:P
  • 0

#16 4582

4582

    Chưa sử dụng CAD

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

Đã gửi 10 January 2008 - 04:54 PM

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

#17 leolas

leolas

    biết lệnh stretch

  • CADViet Team
  • PipPipPip
  • 163 Bài viết
Điểm đánh giá: 133 (tàm tạm)

Đã gửi 17 March 2008 - 01:49 PM

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
  • 0
Let those who only see the thorns have eyes to see the rose

#18 vndesperados

vndesperados

    biết lệnh xref

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

Đã gửi 17 March 2008 - 02:01 PM

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

#19 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1070 (rất tốt)

Đã gửi 17 March 2008 - 04:45 PM

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)))
)
;;;--------------------------------------------------------------------

  • 0

#20 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 March 2008 - 08:24 PM

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