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

Tue_NV

Moderator
  • Số lượng nội dung

    4260
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    288

Bài đăng được đăng bởi Tue_NV


  1. Đây là lisp GA của em sưu tầm được

     

    Thế này nha, dựa trên cơ sở của lisp GA có sẵn rồi, các bác viết cho em thêm phần tính weight theo công thức weight= (areax2,7)/1000 đơn vị là kg/m (khối lượng tính cho một m) ok và cho in ra kết quả luôn.

    Bác cứ tính theo công thức của em đưa ra là được em cảm ơn?

    Đây là lisp của bạn mình làm theo ý bạn rồi nè :

    (defun C:GA()
    
    ;;;--- Turn the command echo off
     (setvar "cmdecho" 0)
    
    ;;;--- Inform the user of the plot number
     (princ "\n Starting Number is ")(princ (getvar "useri1"))
     (princ ".   To change this, reset the system variable USERI1")
    
    ;;;--- Get the interior selection point
     (setq pt(getpoint "\n Select Interior of Area : "))
    
    ;;;--- Create a hatch pattern in the area
     (command "-bhatch" "Advanced" "Island" "No" "Nearest" "" pt "")
    
    ;;;--- If the hatch pattern was created...
     (if(setq en(entlast))
    (progn
    
    ;;;--- Get the dxf group codes from the hatch entity
      (setq enlist(entget en))
    
    ;;;--- Build a list to eventually make a polyline entity
      (setq plist(list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline")))
    
    ;;;--- Set up an empty list, a flag, and a counter
      (setq newList(list) flag 0 cntr 0)
    
    ;;;--- Cycle through every item in the hatch's dxf group codes
      (while(
      ;;;--- Get the first item
    	(setq a(nth cntr enlist))
    
      ;;;--- If it is the first group code 10, increment the flag and proceed
    	(if (= (car a) 10)(setq flag(+ flag 1)))
    
      ;;;--- Skip the first group code 10 in the entity list
    	(if (> flag 1)
    
    	;;;--- If the dxf group code number is 10, then...
    	  (if(= (car a) 10)
    		(progn
    
    		;;;--- Start a temporary list holding the dxf group codes for a VERTEX entity
    		;;;	Add codes 0 and 10
    		  (setq tmp(list (cons 0 "VERTEX") a))
    
    		;;;--- In case there are bulges, look for codes 42 and 50 while the next code isn't
    		;;;	a group code 10 and there are more items in the dxf group codes to look for.
    		  (while(and (B) 42)(= (car B) 50))
    
    			;;;--- Add it to the temporary list
    			  (setq tmp(append tmp (list B)))
    
    			)
    		  )
    
    		;;;--- Add the temporary list to the new list
    		  (setq newList(append newList (list tmp)))
    		)
    	  )
    	)
    
      ;;;--- Increment the counter to get the next group 10 code
    	(setq cntr(+ cntr 1))
      )
    
    ;;;--- In order to close the polyline, we will need to save the start point
    ;;;	and use it later as the end point of the polyline
      (setq lastPt(car newList))
    
    ;;;--- Strip off the last point, which is the point selected during the hatch command
      (setq newList(reverse(cdr(reverse newList))))
    
    ;;;--- Delete the hatch pattern
      (entdel en)
    
    ;;;--- Start creating the polyline entity
      (entmake 
    	(list 
    	  (cons 0 "POLYLINE") ; Object type
    	  (cons 66 1)		 ; Vertices follow
    	)
      )
    
    ;;;--- Add each vertex to the polyline entity...
      (foreach a newList
    	(entmake a )
      )
    
    ;;;--- Close the polyline by adding the first point
      (entmake lastPt)
    
    ;;;--- Finally add the SEQEND to create the polyline
      (entmake (list (cons 0 "SEQEND")))	
    
    ;;;--- Get the entity name of the polyline just created
      (setq en(entlast))
    
    ;;;--- Use the area command on the polyline
      (command "area" "Object" en)
    
    ;;;--- Get the Area of the Polyline
      (setq myArea(getvar "area")) 
    
    
    
    ;;;--- NOTE: Here would be a good place to do any manipulation of the area.
    ;;;	Such as converting it to square feet or acres.
    
    
    ;;;--- Get the perimeter of the polyline
      (setq myPerim(getvar "perimeter"))
    
    
    ;;;--- NOTE: Here would be a good place to do any manipulation of the perimeter.
    ;;;		  Such as converting to feet or meters.
    
    
    ;;;--- Get the plot number to use from the USERI1 system variable.
      (setq myNum(getvar "useri1"))
    
    ;;;--- Don't start with zero, which is Autocad's default
      (if(= myNum 0)(setq myNum 1))
    
    ;;;--- Increment the counter before saving for next time
      (setvar "useri1" (+ myNum 1))
    
    ;;;--- Convert the number to a string
      (setq myNum(itoa myNum))
    
    ;;;--- Grab the current textsize
      (setq tht(getvar "textsize"))
    
    ;;;--- Get the current text style
      (setq csty(getvar "textstyle"))
    
    ;;;--- See if the text style has a preset height
      (if(= 0 (cdr(assoc 40(tblsearch "style" csty))))
    	(progn
    
    	;;;--- Insert the text with a height parameter
    (setq kl (/ (* myArea 2.7) 1000)) 
    	  (command "text" "Justify" "Center" Pt tht 0 myNum)
    	  (command "text" "Justify" "Center" (polar Pt (* pi 1.5) (* tht 1.5)) tht 0 (strcat "AREA=" (rtos kl 2 4)))
    	(setq kl (/ (* myArea 2.7) 1000)) 
    	  (command "text" "Justify" "Center" (polar Pt (* pi 1.5) (* 2.0(* tht 1.5))) tht 0 (strcat "PERIMETER=" (rtos myPerim)))
      (command "text" "Justify" "Center" (polar Pt (* pi 1.5) (* 3.0(* tht 1.5))) 0 (strcat "Weight=" (rtos kl 2 4)))
    	)
    	(progn
    
    	;;;--- Else, Insert the text without a height parameter
    (setq kl (/ (* myArea 2.7) 1000)) 
    	  (command "text" "Justify" "Center" Pt 0 myNum)
    	  (command "text" "Justify" "Center" (polar Pt (* pi 1.5) (* tht 1.5)) 0 (strcat "AREA=" (rtos myarea 2 4)))
    	  (command "text" "Justify" "Center" (polar Pt (* pi 1.5) (* 2.0(* tht 1.5))) 0 (strcat "PERIMETER=" (rtos myPerim)))
    (command "text" "Justify" "Center" (polar Pt (* pi 1.5) (* 3.0(* tht 1.5))) 0 (strcat "Weight=" (rtos kl 2 4)))
    	)
      )
    
    ;;;--- Delete the polyline entity
      (entdel en)
    )
    (alert "Hatch pattern could not be created.  Make sure the area is enclosed.")
     )
    
    ;;;--- Turn the command echo back on
     (setvar "cmdecho" 1)
    
    ;;;--- Suppress the last echo for a clean exit
     (princ)
    )

    Bạn chạy thử nhé.


  2. Chào mọi người!

    Tôi mới tìm hiểu về lisp. Mong mọi người giúp đỡ. Tôi viết một chương trình nhỏ nhưng chạy không được không biết lỗi chỗ nào. Chỉ dùm tôi với:

    (defun c:dt()

    (command "cicrle") Sai lệnh

    (setq pt (getpoint "cho tam duong tron:"))

    (setq D (getdist "cho ban kinh duong tron:")

    (princ)

    )

    Thứ nhát là : Bạn viết tên lệnh bị sai. Lệnh vẽ đường tròn là circle chứ không phải là "cicrle")

    Thứ hai ở dòng đậm : (setq D (getdist "cho ban kinh duong tron:") bạn thiếu dấu đóng ngoặc , phải viết là :

    (setq D (getdist "cho ban kinh duong tron:"))

    Thứ ba là dòng thực hiện lệnh : Command bạn phải đưa xuống dưới cùng :

    Mình viết lại như sau :

    Tên lệnh là : dt

    (defun c:dt ()
    (prompt "Ve duong tron :")
    (setq pt (getpoint "cho tam duong tron:")) (terpri)
    (setq D (getdist "cho ban kinh duong tron:"))
    (command "circle" pt D)
    )

    .

    Bạn có thắc mắc gì hỏi nhé.


  3. Em rất hay phải dùng lệnh scale với tỉ lệ khác nhau, thường thì em vẫn thường dùng lệnh scale->"r" rồi nhập 2 kích thước. Dùng cách này cũng được nhưng khi hay phải dùng thi mất thời gian quá. Bác có cái lisp mỗi khi dùng thì mình chỉ cần chọn hình cần phải scale, sau đó pick vào 2 cạnh (vd: 2 cạnh của 2 hình chữ nhật, hoặc 2 đường line) thì nó tự chia chiều dài cạnh (hoặc line) của hình này cho hình kia và scale hình minh cần scale đúng theo tỉ lệ đó không các anh?

    thankssss!!!!

    Mình mới viết được đoạn lisp này. Hy vọng nó chạy theo đúng ý bạn :

     

    (defun C:SCC ()
    (prompt "Ban chon doi tuong scale")
    (princ "\nSelect object :")
    (setq obj (ssget))
    (setq base (getpoint "Diem goc scale :")) (terpri)
    (prompt "Ban nhap ti le scale = canh thu 1 chia cho canh thu 2") (terpri)
    (setq c1 (getpoint "Pick vao canh 1:")) (terpri)
    (command "lengthen" c1 "")
    (setq L1 (getvar "perimeter"))
    (setq c2 (getpoint "Pick vao canh 2:")) (terpri)
    (command "lengthen" c2 "")
    (setq L2 (getvar "perimeter"))
    (setq TL (/ L1 L2))
    (command "scale" obj "" base TL)
    )

    .

    Các bạn cho ý kiến. Thanks động viên nhé.

    • Vote tăng 1

  4. Tên của lệnh này là gì vậy bạn. Mình vẽ cad, sử dụng lips nhiều nhưng không biết tý tẹo gì về viết lips hết. Buồn....

    * Để biết tên lệnh là gì?

    Bạn mở file lsp ra, tìm đến các dòng mã (defun c:, phía sau c: là tên lệnh. Ví dụ: (defun c:CT thì tên lệnh là CT.

    Bạn xem ở đây: Hướng dẫn sử dụng mã lisp


  5. Trong Autocad có những dạng đường mà có cả chữ xen kẽ với nét vẽ, nhưng em ko biết cách thay đổi chữ đó theo ý của mình. Ví dụ muốn có đường dạng : -------CN---------CN---------, hoặc --------TN-----------TN--------------TN----------. Bác nào biết chỉ dùm em với. Mình có thể thay đổi cái chữ đó hay là mình phải tạo ra một dạng đường khác với chữ theo ý của mình?

    Cám ơn các bác trước,

    Tạo kiểu nét phức hình chuỗi :

    Bạn phải đưa văn bản và thuộc tính của nó vào trong định nghĩa kiểu nét.

    Định dạng của kiểu nét phức hình chuỗi là :

    ["String",Text Style, Text Height, Rotation, X-offset,Y-offset]

    Mình sẽ viết kiểu nét phức chuỗi "CN" như thế này :

     

    *DuongkethopchuCN,CN

    A,0.75,["CN",Standard,S=0.1,A=0,X=0.05,Y=-0.05],-0.575

     

    Bạn mở chương trình soạn thảo Notepad lên, chép đoạn chữ in đậm vào và lưu file với đuôi mở rộng là .lin

    Sau đó vào CAD, đánh lệnh linetype -> Trong hộp thoại Linetype Manager chọn load -> trong hộp thoại load and reload linetype -> Chọn file -> sau đó chọn file .lin mà bạn vừa tạo -> OK.

    Lúc này, bạn sẽ tạo đwợc đường có chữ CN xen kẽ với nét vẽ.

    Muốn thay đổi chữ CN thành chữ TN thì bạn thay chuuõi "CN" thành chữ "TN" trong file .lin vừa tạo.

    Bạn cứ làm thử. Nếu có gì vướng mắc hỏi mình nhé.


  6. Tôi thấy ko chuột giữa ko sao!

    Pan : P enter ;

    Zoom : Z enter

    muốn nhìn toàn bộ phần vẽ: e enter

    muốn nhìn 1 phần nhỏ: chọn cửa sổ nhỏ là zoom lên liền

    Ah quên để nhanh hơn nên đánh lệnh: VTduration trước cho mặc định 750 thành 0 là ok!

    cách của tôi thế được không các Pro.

    Cách của bạn chỉ thực hiện được khi mình chưa thực hiện được câu lệnh nào cả.

    Còn khi thực hiện câu lệnh rồi (Ví dụ như lệnh Move thì ở dòng select object: thì làm sao gõ Zoom : Z enter được..

    tức là ta không thể dùng cách của bạn để phóng to hay pan ở dòng lệnh Select Object đwợc.

    Lúc này bạn phải vào Tool ->option ->Customize -> chọn Keyboard ->

    Ở nhãn Categories -> Chọn View Menu -> Thiết lập phím tắt cho zoom realtime và pan realtime mới đwợc.

    . Lúc này bạn pan hay zoom bằng phím tắt được. Chúc thành công.


  7. Xin hỏi, lúc vẽ đường tròn xong rồi zoom lại, thì thấy đường tròn có biểu hiện những nét gãy khúc, vậy làm cách nào để làm đường tròn mịn hơn vậy các bác. xin cảm ơn.

    Bạn gõ lệnh Viewres như sau :

     

    Command: viewres

     

    Do you want fast zooms? [Yes/No] <Y>: Y : Gõ Y

     

    Enter circle zoom percent (1-20000) <100>: 20000 : Gõ 20000 : Giá trị cao nhất

    Regenerating model.

     

    .Đường tròn, Spline sẽ mịn hơn, trơn tru hơn. Bạn thử xem. Chúc thành công.


  8. mình muốn chuyển 1 đường từ layer này sang layer khác, bạn nào biết cách giúp mình với. Mình dùng lệnh change mà không được. Chỉ có một file bị như thế thôi, các file khác thì vẫn chuyển bình thường.

    Mình sử dụng lệnh change được mà. Nếu sử dụng lệnh change không được thì bạn sử dụng lệnh sau :

    -> Chọn Tool -> Express -> Layers -> Layer Match (tức là sử dụng lệnh laymch trong phụ trợ Express của AutoCad.


  9. Mình đánh lệnh

    Command : tktt

    Hiện lên hộp thoại THONG KE THEP TRON. Mình chọn nút Tổng hợp ở dưới cùng.

    Sau đó chương trình hiện lên hộp thoại TONG HOP THEP TRON. Chọn tiếp nút Tổng hợp,

    chương trình hỏi chọn điểm trên bên trái. Mình chọn điểm trên, bên trái (dưới chữ CK ở bên trái),

    chương trình hỏi chọn điểm dưới bên phải. Mình chọn điểm dưới, bên phải (góc bên phải dwới cùng của bảng thống kê),

    chương trình hỏi chọn điểm viết kết quả thì mình chọn một điểm trên màn hình.

    Và sau đó thì chương trình báo lỗi sau :

    Command:

    Chon diem tren ben trai:

    Chon diem duoi ben phai:

    Chon diem viet ket qua: INSERT Enter block name or [?] <tieude>: thtoktruoc

    "thtoktruoc.dwg": Can't find file in search path:

    C:\Documents and Settings\Administrator\Application Data\Autodesk\AutoCAD

    2004\R16.0\enu\support\

    C:\Program Files\AutoCAD 2004\support\

    C:\Program Files\AutoCAD 2004\fonts\

    C:\Program Files\AutoCAD 2004\help\

    C:\Program Files\AutoCAD 2004\express\

    C:\Program Files\AutoCAD 2004\support\color\

    C:\Tktduy\

    C:\Program Files\AutoCAD 2004\

    *Invalid*

     

    Error:Function cancelled; error: An error has occurred inside the *error*

    functionbad argument type: fixnump: "4"

    Hình như trong file C:\Tkduy còn thiếu file tổng hợp thép nào đó.

    Mong bác duy 782006 hồi âm sơm. cảm ơn nhiều.

    Hình như trong file C:\Tkduy còn thiếu file tổng hợp thép nào đó.

    Mong bác duy 782006 hồi âm sơm. cảm ơn nhiều.


  10. nếu bạn có hình chữ nhặt kích thước 30x50 muốn có hình chữ nhật có chiều rộng 50 x chiều dài sẽ tăng lên theo tỷ lệ phóng của chiều rộng

     

    Khi Sc nhập tỷ lệ phóng: 50/30 là được

    Bạn sử dụng lệnh scale kết hợp với lệnh cal như sau :

    Command: sc SCALE

    Select objects: Specify opposite corner: 1 found : Chọn đối tượng

     

    Select objects: không chọn đối tượng nữa

     

    Specify base point: điểm gốc scale

    Specify scale factor or [Reference]: 'cal ; nhấn 'cal

    >> Expression: 50/30 ; nhấn 50/30

    1.66667

     

    là được. Chúc thành công.

    • Vote tăng 1

  11. Lổi sao bạn?

    Nó có lên được hộp thoại hỏi cấu kiện và tổng hợp không?

    Mình đánh lệnh

    Command : tktt

    Hiện lên hộp thoại THONG KE THEP TRON. Mình chọn nút Tổng hợp ở dưới cùng.

    Sau đó chương trình hiện lên hộp thoại TONG HOP THEP TRON. Chọn tiếp nút Tổng hợp,

    chương trình hỏi chọn điểm trên bên trái. Mình chọn điểm trên, bên trái (dưới chữ CK ở bên trái),

    chương trình hỏi chọn điểm dưới bên phải. Mình chọn điểm dưới, bên phải (góc bên phải dwới cùng của bảng thống kê),

    chương trình hỏi chọn điểm viết kết quả thì mình chọn một điểm trên màn hình.

    Và sau đó thì chương trình báo lỗi sau :

    Command:

    Chon diem tren ben trai:

    Chon diem duoi ben phai:

    Chon diem viet ket qua: INSERT Enter block name or [?] <tieude>: thtoktruoc

    "thtoktruoc.dwg": Can't find file in search path:

    C:\Documents and Settings\Administrator\Application Data\Autodesk\AutoCAD

    2004\R16.0\enu\support\

    C:\Program Files\AutoCAD 2004\support\

    C:\Program Files\AutoCAD 2004\fonts\

    C:\Program Files\AutoCAD 2004\help\

    C:\Program Files\AutoCAD 2004\express\

    C:\Program Files\AutoCAD 2004\support\color\

    C:\Tktduy\

    C:\Program Files\AutoCAD 2004\

    *Invalid*

     

    Error:Function cancelled; error: An error has occurred inside the *error*

    functionbad argument type: fixnump: "4"

    Hình như trong file C:\Tkduy còn thiếu file tổng hợp thép nào đó.

    Mong bác duy 782006 hồi âm sơm. cảm ơn nhiều.


  12. <a href="http://www.cadviet.com/upfiles/tktduy.zip" target="_blank"><a href="http://www.cadviet.com/upfiles/tktduy.zip" target="_blank"><a href="http://www.cadviet.com/upfiles/tktduy.zip" target="_blank">http://www.cadviet.com/upfiles/tktduy.zip</a></a></a>

     

    Đây là lisp thống kê thép do tôi viết: vì đang nghiên cứu phần hộp thoaị nên cái này hơi tệ nhưng ba con dùng thử xem:

    - TKTT: thống kê thép tròn (24 hình dáng thép)

    - TKTH: thống kê thép hình (C; O; []; V)

    - TKTM: thống kê thép mã

    Mình dùng các lệnh đều chạy tốt cả. Cảm ơn bác duy782006. Riêng lệnh TKTT và trong hộp thoại này có tổng hợp thì chương trình báo lỗi. Hình như bị thiếu file để tổng hợp thép đấy. Bác xem lại giúp nhé.


  13. e đang làm đồ án cần copy những hình vẽ từ CAD sang MS Word mà sau khi copy xong paste vào Word thì trong Word chỉ hiện lên mỗi dòng chữ

    {EMBED AutoCAD.Drawing.16} mà không hiển thị hình vẽ mà e copy. làm sao cho đc bây giờ mấy anh ơi!?

    mail hoac trả lời giúp đệ với! namtai2003@yahoo.com

    Bạn vào Menu : Tool -> Chọn option -> View -> Sau đó trong mục Show bỏ chọn dấu tick Field Codes .


  14. Tôi cũng biết lệnh Change text (CHT) trong acad nhưng tôi muốn hỏi cách viết mã lisp để học hỏi về nhôn ngữ lisp.

    - ttôi đã biết được mã lisp để chọn tất cả các text trong lớp "HOten" nhưng không biết đoạn mã nào để thay đổi tất cả thuộc tính của chúng.

    Các bạn gíup tôi với nhé .

    Text có rất nhiều thuộc tính. Bạn nói chung chung quá. Bạn có thể nói rõ hơn được không?


  15. Tôi mới làm quen với lisp. Tôi xin hỏi các bạn là : tôi muốn thay đổi thuộc tính (Heihght = 5, textstyle= vnarial) tất cả các đối tượng text thuộc lớp "hoten" trong bản vẽ thì viết lisp như thế nào ? tôi đã viết lệnh sau nhưng không được. Tôi không biết dùng hàm gì để thay dổi được tất cả các text thuộc lớp "hoten" trong bản vẽ.

    các bạn xem giúp tôi nhé.

     

    (setq ent(ssget "x" (list (cons 8 "hoten")(cons 0 "TEXT"))))

    (setq n(sslength ent))

    (command "text" "j" "C" "" "0" n )

    Mình nghĩ rằng không nhất thiết phải sử dụng Lisp, bạn hãy dùng lệnh filter trong AutoCad.

    Để thay đổi đối tượng thì đầu tiên bạn phải lựa chọn đối tượng

    Command : filter

    Bạn Add to list :

    layer = hoten

    Text Style name = vnarial

    Text Height = 5

    Object = Text

    Bạn lưu cách chọn lựa này theo một tên nào đó trong hộp Save As sau đó Apply chọn đối tượng là xong


  16. Hy vọng đoạn code sau đúng ý bạn.

     

    (DEFUN IsNumeric (str)
     (if (not(vl-string-search " " str))
       (if (member (type (read str)) '(REAL INT) )
         T
         nil
         )
       nil
       )
     )
    
    (defun C:cg1 ()
     (setvar "CMDECHO" 0)
     (setq pre (getint "\nSo chu so sau dau phay?"))
     (command "luprec" pre)
     (setq tong 0)
     (SETQ TH (SSGET (list (cons 0 "TEXT"))))
     (SETQ QUANT (SSLENGTH TH))
     (SETQ INDEX 0)
     (WHILE (< INDEX QUANT)
     (setq s (entget (SSNAME TH INDEX)))
     (setq otext (assoc 1 s))
     (setq ot (cdr otext))
     (if (IsNumeric ot) ;neu noi dung ot la so
       (setq ot (atof ot)
    	 tong (+ ot tong)) ; tinh tong
       ) 	 
       (setq index (+ index 1))
     )
     (prompt "\n Chon gia tri can thay the")
     (SETQ TT (SSGET))
     (SETQ QUAN (SSLENGTH TT))
     (SETQ INDE 0)
     (WHILE (< INDE QUAN)
     (setq s (entget (SSNAME TT INDE)))
     (setq otext (assoc 1 s))
     (setq nt (cons 1 (rtos Tong 2 pre)))
     (setq s (subst nt otext s))
     (entmod s)
       (setq inde (+ inde 1))
     )
    )

    Đúng là đoạn Code trên tính tổng của các số (sau khi loại bỏ các text chữ). Nhưng ý của em ngay từ đầu là muốn chọn đối tượng là text số để xử lý phép tính số học sau khi chọn bằng Grid.

    Ứng dụng hàm IsNumeric là hàm kiểm tra nội dung của 1 chuỗi là số, em viết đoạn Code dưới đây để thực hiện phép tính cộng thêm vào giá trị được chọn để giá trị được chọn nhận kết quả mới là thêm một giá trị cộng thêm vào. Nhưng đoạn Code dưới bị lỗi mà em chưa biết sai ở đâu. Anh sửa lại giúp em với nhé.

    (DEFUN IsNumeric (str)
     (if (not(vl-string-search " " str))
       (if (member (type (read str)) '(REAL INT) )
         T
         nil
         )
       nil
       )
     )
    (defun c:cso()
    (setvar "CMDECHO" 0)
    (setq pre (getint "\nSo chu so sau dau phay?"))
    (command "luprec" pre)  
    (setq co (getreal "\nGia tri can cong them:"))
    (SETQ TH (SSGET(list(cons 0 "TEXT"))))
    (SETQ QUANT (SSLENGTH TH))
     (SETQ INDEX 0)
     (WHILE (< INDEX QUANT)
    		 (setq s (entget (SSNAME TH INDEX)))
    	   (setq otext (assoc 1 s))
    	   (setq ot (cdr otext))
    	  (if(IsNumeric ot)
    	      (setq ot (atof ot))
    	      (setq nt (cons 1 (rtos (+ ot co))))  
    	      (setq s (subst nt otext s))
    	      (entmod s)
       		   )
       (setq index (+ index 1))
     )
    )

    Cám ơn anh nhé.


  17. Hàm kiểm tra nội dung của 1 chuỗi là số

    không xét t/hợp chuỗi có định dạng thêm khoảng trắng giữa hàng ngàn. vd : 23 000 -> 23000

    (DEFUN IsNumeric (str)

    (if (not(vl-string-search " " str))

    (if (member (type (read str)) '(REAL INT) )

    T

    nil

    )

    nil

    )

    )

    Đoạn code của bạn được sửa lại :

    (DEFUN IsNumeric (str)
     (if (not(vl-string-search " " str))
       (if (member (type (read str)) '(REAL INT) )
         T
         nil
         )
       nil
       )
     )
    
    (defun C:cg ()
     (setvar "CMDECHO" 0)
     (setq pre (getint "\nSo chu so sau dau phay?"))
     (command "luprec" pre)
     (setq tong 0)
     (SETQ TH (SSGET))
     (SETQ QUANT (SSLENGTH TH))
     (SETQ INDEX 0)
     (WHILE (< INDEX QUANT)
       (IF
         (AND (= "TEXT"
          (CDR (ASSOC 0 (SETQ A (ENTGET (SSNAME TH INDEX)))))
       )
         )
          (PROGN
     (setq s (entget (SSNAME TH INDEX)))
     (setq otext (assoc 1 s))
     (setq ot (cdr otext))
     (if (IsNumeric ot) ;neu noi dung ot la so
       (setq ot (atof ot)
    	 tong (+ ot tong)) ; tinh tong
       ) 	 
          )
       )
       (setq index (+ index 1))
     )
     (prompt "\n Chon gia tri can thay the")
     (SETQ TT (SSGET))
     (SETQ QUAN (SSLENGTH TT))
     (SETQ INDE 0)
     (WHILE (< INDE QUAN)
       (IF
         (AND (= "TEXT"
          (CDR (ASSOC 0 (SETQ A (ENTGET (SSNAME TT INDE)))))
       )
         )
          (PROGN
     (setq s (entget (SSNAME TT INDE)))
     (setq otext (assoc 1 s))
    ;;;	 (setq ot (cdr otext))
    ;;;	 (setq ot (read (substr ot 1)))
     (setq nt (cons 1 (rtos Tong 2 pre)))
     (setq s (subst nt otext s))
     (entmod s)
          )
       )
       (setq inde (+ inde 1))
     )
    )

    Rất cảm ơn anh đã giúp đỡ cho em.

    Nhưng tổng quát ý của em ngay từ đầu là muốn chọn đối tượng là số để xử lý sau khi chọn bằng Grid.

    Vì còn nhiều lệnh AutoLisp về phép tính số học cần được giải quyết.

    Hàm IsNumeric này quả thật em chưa biết.

    Anh giúp em nhé. Cảm ơn anh.

    (Có thể bạn chọn đối tượng đầu tiên bằng Grid rồi thực hiện lệnh AutoLisp thì các Grid biến mất. nhưng khi thực hiện lệnh Lisp thì ở trong câu Select Object : bạn nhấn chữ P(previous) các đối tượng text số chọn ra đó sẽ được chọn lại. )

×