Đến nội dung


Hình ảnh
- - - - -

Em đang học Lisp, nhờ các anh sửa júp em đoạn mã bị lỗi !!!!!


  • Please log in to reply
15 replies to this topic

#1 leejang

leejang

    biết lệnh move

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

Đã gửi 30 June 2009 - 06:03 AM

Em muốn viết lisp như sau :
Command: HT
select object : chọn vào hatch
select text to result :
hiện tại kết quả đang = 0, còn lỗi đôi chút, mong các bác sửa júp em với !!!
CODE
;=========dien tich hatch=========
(defun C:ht (/ tot_len ss e_name e_record e_type)
(princ "\nHoang Giang ")
(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 "hatch")
(command "area" "o" e_name)
(setq tot_len (+ tot_len ))
(ssdel e_name ss)
)
((wcmatch e_type "hatch") (add_mline))
(e_type (ssdel e_name ss))
)
)
(if co1
(setq co2 (getreal (strcat "\nHe so <" (rtos co1) ">:")))
(setq co1 (getreal "\nHe so :" )))

(if co2 (setq co1 co2))

(prompt (strcat "\nDien tich hatch: " (rtos tot_len 2 2)))
(setq giatri (entget (car (entsel "\n Select Text to results: "))))
(command "luprec" "2")
(setq gia (assoc 1 giatri))
(setq nt1 (cons 1 (rtos (* tot_len co1 ))))
(setq giatri (subst nt1 gia giatri))
(entmod giatri)
(princ)
(princ)
)
  • 0

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 30 June 2009 - 11:16 AM

Em muốn viết lisp như sau :
Command: HT
select object : chọn vào hatch
select text to result :
hiện tại kết quả đang = 0, còn lỗi đôi chút, mong các bác sửa júp em với !!!
CODE
;=========dien tich hatch=========
(defun C:ht (/ tot_len ss e_name e_record e_type)
(princ "\nHoang Giang ")
(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 "hatch")
(command "area" "o" e_name)
(setq tot_len (+ tot_len ))
(ssdel e_name ss)
)
((wcmatch e_type "hatch") (add_mline))
(e_type (ssdel e_name ss))
)
)
(if co1
(setq co2 (getreal (strcat "\nHe so <" (rtos co1) ">:")))
(setq co1 (getreal "\nHe so :" )))

(if co2 (setq co1 co2))

(prompt (strcat "\nDien tich hatch: " (rtos tot_len 2 2)))
(setq giatri (entget (car (entsel "\n Select Text to results: "))))
(command "luprec" "2")
(setq gia (assoc 1 giatri))
(setq nt1 (cons 1 (rtos (* tot_len co1 ))))
(setq giatri (subst nt1 gia giatri))
(entmod giatri)
(princ)
(princ)
)

Chào bạn Leejang,
Bạn hày xem lại các dòng code sau:
1/-(setq tot_len (+ tot_len ))
2/- (setq nt1 (cons 1 (rtos (* tot_len co1 ))))
Chúc bạn thành công.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 leejang

leejang

    biết lệnh move

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

Đã gửi 30 June 2009 - 01:19 PM

[quote name='phamthanhbinh' date='Jun 30 2009, 11:16' post='65821']
Chào bạn Leejang,
Bạn hày xem lại các dòng code sau:
1/-(setq tot_len (+ tot_len ))
2/- (setq nt1 (cons 1 (rtos (* tot_len co1 ))))
Chúc bạn thành công.
Anh nào sửa giúp em đi ? Em ko sửa được, em ko bit cách gán kết quả sau dòng (command "area" "o" e_name) vào biến như thế nào ? huhuhuhu
  • 0

#4 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 02 July 2009 - 02:52 PM

Em muốn viết lisp như sau :
Command: HT
select object : chọn vào hatch
select text to result :
hiện tại kết quả đang = 0, còn lỗi đôi chút, mong các bác sửa júp em với !!!
CODE
;=========dien tich hatch=========
.....................

Chào leejang
Từ phiên bản Cad 2006, đối tuợng Hatch mới có thuộc tính Diện tích.
Nếu bạn sử dụng phiên bản Cad 2005 trở về truớc thì pótay.
bạn chạy thử Lisp này (cho phiên bản Cad 2006 đến nay):
(defun c:HatchArea (/ cnt tot ss obj )
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(progn
(vl-load-com)
(setq cnt 0 tot 0 )
(prin "\nChon hatches : ")
(if (ssget '((0 . "HATCH")))
(progn
(vlax-for
h
(setq ss (vla-get-ActiveselectionSet (vla-get-ActiveDocument (vlax-get-acad-object)) ) )
(setq cnt (1+ cnt)
tot (+ tot (vla-get-Area h))
)
)
(vla-delete ss)
)
)
(princ (strcat "\nTong dien tich cua "(itoa cnt) " Hatch la : " (rtos tot) ) )
(setq obj (entsel "\nChon text de ghi ket qua hay Enter de ket thuc."))
(if (and
obj
(setq obj (vlax-ename->vla-object (car obj)))
(eq (vlax-get obj 'ObjectName) "AcDbText")
)
(vla-put-TextString obj (rtos tot))
)
(princ)
)
(alert "\nPhien ban AutoCad cua ban khong ho tro tinh dien tich Hatch ")
)
)

  • 1

#5 leejang

leejang

    biết lệnh move

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

Đã gửi 06 July 2009 - 07:57 AM

Chào leejang
Từ phiên bản Cad 2006, đối tuợng Hatch mới có thuộc tính Diện tích.
Nếu bạn sử dụng phiên bản Cad 2005 trở về truớc thì pótay.
bạn chạy thử Lisp này (cho phiên bản Cad 2006 đến nay):

(defun c:HatchArea (/ cnt tot ss obj )
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(progn
(vl-load-com)
(setq cnt 0 tot 0 )
(prin "\nChon hatches : ")
(if (ssget '((0 . "HATCH")))
(progn
(vlax-for
h
(setq ss (vla-get-ActiveselectionSet (vla-get-ActiveDocument (vlax-get-acad-object)) ) )
(setq cnt (1+ cnt)
tot (+ tot (vla-get-Area h))
)
)
(vla-delete ss)
)
)
(princ (strcat "\nTong dien tich cua "(itoa cnt) " Hatch la : " (rtos tot) ) )
(setq obj (entsel "\nChon text de ghi ket qua hay Enter de ket thuc."))
(if (and
obj
(setq obj (vlax-ename->vla-object (car obj)))
(eq (vlax-get obj 'ObjectName) "AcDbText")
)
(vla-put-TextString obj (rtos tot))
)
(princ)
)
(alert "\nPhien ban AutoCad cua ban khong ho tro tinh dien tich Hatch ")
)
)

Bác Gia_Bach à !!Em hay dùng phiên bản CAD 2004 vì thằng đó nhẹ và chạy ổn định, Máy em thì yếu. Em vẫn tính diện tích Hatch bằng LI được mà . Bác xem chỉnh thế nào để nó chạy được trên CAD 2004 với...
  • 0

#6 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 July 2009 - 10:06 AM

Bác Gia_Bach à !!Em hay dùng phiên bản CAD 2004 vì thằng đó nhẹ và chạy ổn định, Máy em thì yếu. Em vẫn tính diện tích Hatch bằng LI được mà . Bác xem chỉnh thế nào để nó chạy được trên CAD 2004 với...

Có thể bạn nhầm lẫn giữa đuờng biên (boundary) Hatch và đối tuợng Hatch ?!
Hoặc bạn đang sử dụng phiên bản Cad2004 đặc biệt của AutoDesk ?
Bạn thử gõ lệnh LI(list) rồi chọn đối tuợng Hatch xem ?
  • 0

#7 leejang

leejang

    biết lệnh move

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

Đã gửi 06 July 2009 - 01:23 PM

Có thể bạn nhầm lẫn giữa đuờng biên (boundary) Hatch và đối tuợng Hatch ?!
Hoặc bạn đang sử dụng phiên bản Cad2004 đặc biệt của AutoDesk ?
Bạn thử gõ lệnh LI(list) rồi chọn đối tuợng Hatch xem ?

Bản vẽ người ta làm từ trước, chắc là người ta làm bằng CAD đời cao hơn. khi mình li bằng CAD 2004 thì có AREA còn nếu CAD 2004 mà Hatch sau đó Li thì ko có thật bác à !!!Nhưng hiện tại Lisp bác viết chưa chạy được khi em chạy trên CAD 2007.Em đánh lệnh xong thì chẳng thấy j. Bác xem lại xem có nhầm lẫn chỗ nào ko ???
  • 0

#8 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 July 2009 - 02:19 PM

Bản vẽ người ta làm từ trước, chắc là người ta làm bằng CAD đời cao hơn. khi mình li bằng CAD 2004 thì có AREA còn nếu CAD 2004 mà Hatch sau đó Li thì ko có thật bác à !!!Nhưng hiện tại Lisp bác viết chưa chạy được khi em chạy trên CAD 2007.Em đánh lệnh xong thì chẳng thấy j. Bác xem lại xem có nhầm lẫn chỗ nào ko ???

unKnown ! :s_big:
  • 0

#9 leejang

leejang

    biết lệnh move

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

Đã gửi 07 July 2009 - 06:34 AM

unKnown ! :s_big:

Lisp của bác viết cho em ko chạy được trên bất cứ phiên bản CAD nào. mở CAD 2007 ra chạy, đánh lệnh xong chẳng thấy j ???? Phiền bác check lại júp em với !!!!!
  • 0

#10 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 07 July 2009 - 08:01 AM

Lisp của bác viết cho em ko chạy được trên bất cứ phiên bản CAD nào. mở CAD 2007 ra chạy, đánh lệnh xong chẳng thấy j ???? Phiền bác check lại júp em với !!!!!

Bạn chạy thử Lisp này
(defun c:HatchArea (/ cnt tot ss obj )
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(progn
(vl-load-com)
(setq cnt 0 tot 0 )
(princ "\nChon doi tuong HATCH : ")
(if (setq ss (ssget '((0 . "HATCH"))))
(progn
(foreach e (mapcar 'vlax-ename->vla-Object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(if (vlax-property-available-p e 'Area)
(setq cnt (1+ cnt)
tot (+ tot (vla-get-Area e))
)
)
)
(princ (strcat "\nTong dien tich cua "(itoa cnt) " Hatch la : " (rtos tot) ) )
(setq obj (entsel "\nChon text de ghi ket qua hay Enter de ket thuc."))
(if (and
obj
(setq obj (vlax-ename->vla-object (car obj)))
(eq (vlax-get obj 'ObjectName) "AcDbText")
)
(vla-put-TextString obj (rtos tot))
)
(princ)
)
(princ "\nKhong co doi tuong HATCH nao duoc chon." )
)
)
(alert "\nPhien ban AutoCad cua ban khong ho tro tinh dien tich Hatch ")
)
)


  • 0

#11 leejang

leejang

    biết lệnh move

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

Đã gửi 07 July 2009 - 09:03 AM

Bạn chạy thử Lisp này

(defun c:HatchArea (/ cnt tot ss obj )
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(progn
(vl-load-com)
(setq cnt 0 tot 0 )
(princ "\nChon doi tuong HATCH : ")
(if (setq ss (ssget '((0 . "HATCH"))))
(progn
(foreach e (mapcar 'vlax-ename->vla-Object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(if (vlax-property-available-p e 'Area)
(setq cnt (1+ cnt)
tot (+ tot (vla-get-Area h))
)
)
)
(princ (strcat "\nTong dien tich cua "(itoa cnt) " Hatch la : " (rtos tot) ) )
(setq obj (entsel "\nChon text de ghi ket qua hay Enter de ket thuc."))
(if (and
obj
(setq obj (vlax-ename->vla-object (car obj)))
(eq (vlax-get obj 'ObjectName) "AcDbText")
)
(vla-put-TextString obj (rtos tot))
)
(princ)
)
(princ "\nKhong co doi tuong HATCH nao duoc chon." )
)
)
(alert "\nPhien ban AutoCad cua ban khong ho tro tinh dien tich Hatch ")
)
)


lỗi khi chạy CAD 2007:
Select objects: ; error: bad argument type: VLA-OBJECT nil
  • 0

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 July 2009 - 09:15 AM

lỗi khi chạy CAD 2007:
Select objects: ; error: bad argument type: VLA-OBJECT nil

Bạn thêm dòng :
(vl-load-com)
dưới dòng : (defun c:HatchArea (/ cnt tot ss obj )

xem sao
  • 0

#13 leejang

leejang

    biết lệnh move

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

Đã gửi 07 July 2009 - 10:21 AM

Bạn thêm dòng :
(vl-load-com)
dưới dòng : (defun c:HatchArea (/ cnt tot ss obj )

xem sao

Em Thêm rùi, Vẫn báo lỗi : Select objects: ; error: bad argument type: VLA-OBJECT nil
  • 0

#14 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 07 July 2009 - 11:54 AM

Em Thêm rùi, Vẫn báo lỗi : Select objects: ; error: bad argument type: VLA-OBJECT nil

Sorry leejang, đã fix lỗi.
bạn test lại dùm.
  • 0

#15 leejang

leejang

    biết lệnh move

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

Đã gửi 08 July 2009 - 06:48 AM

Sorry leejang, đã fix lỗi.
bạn test lại dùm.

bác Fix lỗi rùi sao ko up cho em bản Fix lỗi, Em lấy j để Test đây ???
  • 0

#16 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 08 July 2009 - 07:25 AM

bác Fix lỗi rùi sao ko up cho em bản Fix lỗi, Em lấy j để Test đây ???

Bạn lấy code ở bài viết số 10
  • 1