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

AutoCAD với Excel

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

Tôi muốn các bạn chia sẽ cách nhập và xuất số liệu giữa Autocad và Excel, được viết bằng ngôn ngữ AutoLISP. nếu được có thể cho xem ví dụ mẫu.

Cám ơn.

 

Uhm, tui search google được nhiều lắm này. :)

(defun Txt->Excel(/ Boucle Ent Excel_Lance Js Objet_Excel Rng Xl Xl_Classeur Xl_Feuilles Xl_Feuille_Active)

(if (car (setq Objet_Excel (Liaison_Excel)))

(progn

(princ (strcat "\nConnexion avec Excel " (cadr Objet_Excel)))

(princ)

(if (setq Xl (vlax-get-object "Excel.Application"))

(setq Excel_Lance T)

(setq Xl (vlax-create-object "Excel.Application"))

)

(if Xl

(progn

(if (null Xl-open)

(vlax-import-type-library

:tlb-filename (car Objet_Excel)

:methods-prefix "Xl-"

:properties-prefix "Xlp-"

:constants-prefix "Xlc-")

)

(if (not Excel_Lance)

(vlax-invoke-method (vlax-get-property Xl 'WorkBooks) 'Add)

)

(setq Xl_Classeur (vlax-get-property XL "ActiveWorkbook"))

(setq Xl_Feuilles (vlax-get Xl_Classeur "Sheets"))

(setq Boucle 1)

(while (<= Boucle (xlp-get-count Xl_Feuilles))

(if (= (xlp-get-name (xlp-get-item Xl_Feuilles Boucle))(getvar "dwgname"))

(progn

(setq Xl_Feuille_Active (xlp-get-item Xl_Feuilles Boucle))

(xl-activate Xl_Feuille_Active)

)

)

(setq Boucle (1+ Boucle))

)

(if (not Xl_Feuille_Active)

(progn

(setq Xl_Feuille_Active (xl-add (vlax-get Xl_Classeur "Sheets")))

(xlp-put-name Xl_Feuille_Active (getvar "dwgname"))

)

)

(vla-put-visible Xl 1)

(setq Boucle 0)

(if (setq Js (ssget "x" (list (cons 0 "MTEXT,TEXT"))))

(progn

(while (setq Ent (ssname Js Boucle))

(setq Ent (entget Ent))

(setq Rng (xlp-get-range Xl_Feuille_Active (strcat "A" (itoa (1+ Boucle)))))

(xlp-put-value2 Rng (cdr (assoc 1 Ent)))

(setq Boucle (1+ Boucle))

)

(vla-put-visible (vlax-get-acad-object) 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 đã nhắc nhở, mình sơ ý không xem lại. Hình như lỗi này admin bó tay?

Nếu link trên không down được, các bạn down ở đây:

 

http://www.esnips.com/doc/f8166534-fce9-4d...6d5/data_excel2

 

Cái này rất quan trọng, trước mắt là sẽ dùng cho một số module của chương trình LandCadViet Utility. Mong các bạn có điều kiện test giúp.

Một lần nữa, cám ơn nhiều!

Đã test trên Office 2000, Ok, nhưng Office 2002 báo lỗi sau:

Command: test

; error: Automation Error. The Microsoft Jet database engine could not find the

object 'Documents_arraya16:IV16'. Make sure the object exists and that you

spell its name and the path name correctly.

  • 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
Đã test trên Office 2000, Ok, nhưng Office 2002 báo lỗi sau:

Command: test

; error: Automation Error. The Microsoft Jet database engine could not find the

object 'Documents_arraya16:IV16'. Make sure the object exists and that you

spell its name and the path name correctly.

Cám ơn bạn, mình sẽ xem lại sau. Cái này cũng khá lôi thôi!

Bạn nào có office khác test thêm giúp.

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, mình sẽ xem lại sau. Cái này cũng khá lôi thôi!

Bạn nào có office khác test thêm giúp.

Đã test trên office 97, OK

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ờ các bạn xem giúp, cái lisp dưới thực hiện được những công việc gì, cách sử dụng lệnh lisp này làm sao. (mới down về đọc qua chẳng hiểu gì cả, chán quá, đúng là chẳng hiểu gì về lisp cả :)

 

(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
 ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (not (findfile ExcelFile$))
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (progn
     (alert "Excel file not specified.")
     (exit)
   );progn
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
 (if SheetName$
   (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
     (if (= (vlax-get-property Worksheet "Name") SheetName$)
       (vlax-invoke-method Worksheet "Activate")
     );if
   );vlax-for
 );if
 (setq ColumnRow@ (ColumnRow MaxRange$))
 (setq MaxColumn# (nth 0 ColumnRow@))
 (setq MaxRow# (nth 1 ColumnRow@))
 (setq *ExcelData@ nil)
 (setq Row# 1)
 (repeat MaxRow#
   (setq Data@ nil)
   (setq Column# 1)
   (repeat MaxColumn#
     (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
     (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
     (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
     (setq ExcelValue (vlax-variant-value ExcelVariant^))
     (setq ExcelValue
       (cond
         ((= (type ExcelValue) 'INT) (itoa ExcelValue))
         ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
         ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
         ((/= (type ExcelValue) 'STR) "")
       );cond
     );setq
     (setq Data@ (append Data@ (list ExcelValue)))
     (setq Column# (1+ Column#))
   );repeat
   (setq *ExcelData@ (append *ExcelData@ (list Data@)))
   (setq Row# (1+ Row#))
 );repeat
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil)
 *ExcelData@
);defun GetExcel
;-------------------------------------------------------------------------------
; GetCell - Returns the cell value from the *ExcelData@ list
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (GetCell "E19") = value of cell E19
;-------------------------------------------------------------------------------
(defun GetCell (Cell$ / Column# ColumnRow@ Return Row#)
 (setq ColumnRow@ (ColumnRow Cell$))
 (setq Column# (1- (nth 0 ColumnRow@)))
 (setq Row# (1- (nth 1 ColumnRow@)))
 (setq Return "")
 (if *ExcelData@
   (if (and (>= (length *ExcelData@) Row#)(>= (length (nth 0 *ExcelData@)) Column#))
     (setq Return (nth Column# (nth Row# *ExcelData@)))
   );if
 );if
 Return
);defun GetCell
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
; Arguments: 3
;   ExcelFile$ = Excel filename or nil for new spreadsheet
;   SheetName$ = Sheet name or nil for not specified
;   Visible = t for visible or nil for hidden
; Syntax examples:
; (OpenExcel "C:\\Temp\\Temp.xls" "Sheet2" t) = Opens C:\Temp\Temp.xls on Sheet2 as visible session
; (OpenExcel "C:\\Temp\\Temp.xls" nil nil) = Opens C:\Temp\Temp.xls on current sheet as hidden session
; (OpenExcel nil "Parts List" nil) =  Opens a new spreadsheet and creates a Part List sheet as hidden session
;-------------------------------------------------------------------------------
(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (findfile ExcelFile$)
     (setq *ExcelFile$ ExcelFile$)
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (setq *ExcelFile$ "")
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (if ExcelFile$
   (if (findfile ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
   );if
   (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
 );if
 (if Visible
   (vla-put-visible *ExcelApp% :vlax-true)
 );if
 (if (= (type SheetName$) 'STR)
   (progn
     (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
       (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
     );vlax-for
     (if (member SheetName$ Sheets@)
       (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
         (if (= (vlax-get-property Worksheet "Name") SheetName$)
           (vlax-invoke-method Worksheet "Activate")
         );if
       );vlax-for
       (vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
     );if
   );progn
 );if
 (princ)
);defun OpenExcel
;-------------------------------------------------------------------------------
; PutCell - Put values into Excel cells
; Arguments: 2
;   StartCell$ = Starting Cell ID
;   Data@ = Value or list of values
; Syntax examples:
; (PutCell "A1" "PART NUMBER") = Puts PART NUMBER in cell A1
; (PutCell "B3" '("Dim" 7.5 "9.75")) = Starting with cell B3 put Dim, 7.5, and 9.75 across
;-------------------------------------------------------------------------------
(defun PutCell (StartCell$ Data@ / Cell$ Column# ExcelRange Row#)
 (if (= (type Data@) 'STR)
   (setq Data@ (list Data@))
 )
 (setq ExcelRange (vlax-get-property *ExcelApp% "Cells"))
 (if (Cell-p StartCell$)
   (setq Column# (car (ColumnRow StartCell$))
         Row# (cadr (ColumnRow StartCell$))
   );setq
   (if (vl-catch-all-error-p
         (setq Cell$ (vl-catch-all-apply 'vlax-get-property
           (list (vlax-get-property *ExcelApp% "ActiveSheet") "Range" StartCell$))
         );setq
       );vl-catch-all-error-p
       (alert (strcat "The cell ID \"" StartCell$ "\" is invalid."))
       (setq Column# (vlax-get-property Cell$ "Column")
             Row# (vlax-get-property Cell$ "Row")
       );setq
   );if
 );if
 (if (and Column# Row#)
   (foreach Item Data@
     (vlax-put-property ExcelRange "Item" Row# Column# (vl-princ-to-string Item))
     (setq Column# (1+ Column#))
   );foreach
 );if
 (princ)
);defun PutCell
;-------------------------------------------------------------------------------
; CloseExcel - Closes Excel spreadsheet
; Arguments: 1
;   ExcelFile$ = Excel saveas filename or nil to close without saving
; Syntax examples:
; (CloseExcel "C:\\Temp\\Temp.xls") = Saveas C:\Temp\Temp.xls and close
; (CloseExcel nil) = Close without saving
;-------------------------------------------------------------------------------
(defun CloseExcel (ExcelFile$ / Saveas)
 (if ExcelFile$
   (if (= (strcase ExcelFile$) (strcase *ExcelFile$))
     (if (findfile ExcelFile$)
       (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") "Save")
       (setq Saveas t)
     );if
     (if (findfile ExcelFile$)
       (progn
         (vl-file-delete (findfile ExcelFile$))
         (setq Saveas t)
       );progn
       (setq Saveas t)
     );if
   );if
 );if
 (if Saveas
   (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook")
     "SaveAs" ExcelFile$ -4143 "" "" :vlax-false :vlax-false nil
   );vlax-invoke-method
 );if
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil *ExcelFile$ nil)
 (princ)
);defun CloseExcel
;-------------------------------------------------------------------------------
; ColumnRow - Returns a list of the Column and Row number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (ColumnRow "ABC987") = '(731 987)
;-------------------------------------------------------------------------------
(defun ColumnRow (Cell$ / Column$ Char$ Row#)
 (setq Column$ "")
 (while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
   (setq Column$ (strcat Column$ Char$)
         Cell$ (substr Cell$ 2)
   );setq
 );while
 (if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
   (list (Alpha2Number Column$) Row#)
   '(1 1);default to "A1" if there's a problem
 );if
);defun ColumnRow
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
(defun Alpha2Number (Str$ / Num#)
 (if (= 0 (setq Num# (strlen Str$)))
   0
   (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
      (Alpha2Number (substr Str$ 2))
   );+
 );if
);defun Alpha2Number
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
(defun Number2Alpha (Num# / Val#)
 (if (< Num# 27)
   (chr (+ 64 Num#))
   (if (= 0 (setq Val# (rem Num# 26)))
     (strcat (Number2Alpha (1- (/ Num# 26))) "Z")
     (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
   );if
 );if
);defun Number2Alpha
;-------------------------------------------------------------------------------
; Cell-p - Evaluates if the argument Cell$ is a valid cell ID
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = String of the cell ID to evaluate
; Syntax examples: (Cell-p "B12") = t, (Cell-p "BT") = nil
;-------------------------------------------------------------------------------
(defun Cell-p (Cell$)
 (and (= (type Cell$) 'STR)
   (or (= (strcase Cell$) "A1")
     (not (equal (ColumnRow Cell$) '(1 1)))
   );or
 );and
);defun Cell-p
;-------------------------------------------------------------------------------
; Row+n - Returns the cell ID located a number of rows from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of rows from cell
; Syntax examples: (Row+n "B12" 3) = "B15", (Row+n "B12" -3) = "B9"
;-------------------------------------------------------------------------------
(defun Row+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (car Cell$)) (itoa (max 1 (+ (cadr Cell$) Num#))))
);defun Row+n
;-------------------------------------------------------------------------------
; Column+n - Returns the cell ID located a number of columns from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of columns from cell
; Syntax examples: (Column+n "B12" 3) = "E12", (Column+n "B12" -1) = "A12"
;-------------------------------------------------------------------------------
(defun Column+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (max 1 (+ (car Cell$) Num#))) (itoa (cadr Cell$)))
);defun Column+n
;-------------------------------------------------------------------------------
; rtosr - Used to change a real number into a short real number string
; stripping off all trailing 0's.
; Arguments: 1
;   RealNum~ = Real number to convert to a short string real number
; Returns: ShortReal$ the short string real number value of the real number.
;-------------------------------------------------------------------------------
(defun rtosr (RealNum~ / DimZin# ShortReal$)
 (setq DimZin# (getvar "DIMZIN"))
 (setvar "DIMZIN" 8)
 (setq ShortReal$ (rtos RealNum~ 2 8))
 (setvar "DIMZIN" DimZin#)
 ShortReal$
);defun rtosr
;-------------------------------------------------------------------------------
(princ);End of GetExcel.lsp

  • 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
Nhờ các bạn xem giúp, cái lisp dưới thực hiện được những công việc gì, cách sử dụng lệnh lisp này làm sao. (mới down về đọc qua chẳng hiểu gì cả, chán quá, đúng là chẳng hiểu gì về lisp cả :)

Góp ý: với các code khá dài, bạn nên cho nó vào hộp codebox để bài viết gọn gàng (mình đã làm giúp bạn như trên)

 

Chương trình này rất hay, tập hợp một loạt functions để làm việc với excel bằng lisp.

Công dụng các functions:

- getexcel: 3 đối số là file_name, sheet_name và max_range. Return: list dữ liệu từ cell A1 đến cell ứng với max_range

- getcell: lấy dữ liệu tại 1 cell, được chỉ định bằng địa chỉ cell

- openexcel: mở file *.xls có trên đĩa

- putcell: gán giá trị cho cell

- closeexcel: đóng file *xls đã open ở trên

Để hiểu rõ hơn, bạn ghép thêm vào code có sẵn của bạn đoạn sau:

;;;Vi du ap dung cac function tren
;;;---------------------------------------------------------------------
(defun C:VD1()
(vl-load-com)
(setq fn (getfiled "Select Excel File" "" "xls" 0))
(getexcel fn "sheet1" "D5")
)
;;;---------------------------------------------------------------------
(defun C:VD2() (alert (strcat "B3 = " (getcell "B3"))))
;;;---------------------------------------------------------------------
(defun C:VD3() (openexcel fn "sheet4" T))
;;;---------------------------------------------------------------------
(defun C:VD4() (putcell "B10" (list "How"  "are you?")))
;;;---------------------------------------------------------------------
(defun C:VD5() (closeExcel fn))

 

Tạo 1 file *.xls, ghi ở sheet1 các số liệu tuỳ ý, khoảng chừng 4 cột, 6 hàng. Save và thoát hẳn excel

lần lượt các lệnh từ VD1 đến VD5:

- VD1: lấy dữ liệu trong sheet1, từ cell A1 đến cell D5 của file mà bạn chỉ định và chuyển thành list. Bạn bấm F2 sau khi chạy xong sẽ thấy

- VD2: lấy dữ liệu ở cell B3

- VD3: mở file, tạo sheet mới có tên sheet4

- Vẫn để Excel hiện hành, quay lại Acad gõ VD4 -> Cell B10 sẽ được gán nội dung "How" và cell C10 là "are you?"

- VD5: save và thoát Excel

 

Thông suốt được những cái trên đây thì những functions còn lại không thành vấn đề. Chúng chỉ là những tiện ích hỗ trợ thêm (bạn đọc comments và examples của họ sẽ hiểu)

Khi đã nắm được toàn bộ, bạn sẽ giải quyết được vấn đề đã nêu ở topic "Ghi dữ liệu từ Cad sang file Excel đã có".

  • Vote tăng 4

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
Góp ý: với các code khá dài, bạn nên cho nó vào hộp codebox để bài viết gọn gàng (mình đã làm giúp bạn như trên)

 

Chương trình này rất hay, tập hợp một loạt functions để làm việc với excel bằng lisp.

Công dụng các functions:

- getexcel: 3 đối số là file_name, sheet_name và max_range. Return: list dữ liệu từ cell A1 đến cell ứng với max_range

- getcell: lấy dữ liệu tại 1 cell, được chỉ định bằng địa chỉ cell

- openexcel: mở file *.xls có trên đĩa

- putcell: gán giá trị cho cell

- closeexcel: đóng file *xls đã open ở trên

Để hiểu rõ hơn, bạn ghép thêm vào code có sẵn của bạn đoạn sau:

;;;Vi du ap dung cac function tren
;;;---------------------------------------------------------------------
(defun C:VD1()
(vl-load-com)
(setq fn (getfiled "Select Excel File" "" "xls" 0))
(getexcel fn "sheet1" "D5")
)
;;;---------------------------------------------------------------------
(defun C:VD2() (alert (strcat "B3 = " (getcell "B3"))))
;;;---------------------------------------------------------------------
(defun C:VD3() (openexcel fn "sheet4" T))
;;;---------------------------------------------------------------------
(defun C:VD4() (putcell "B10" (list "How"  "are you?")))
;;;---------------------------------------------------------------------
(defun C:VD5() (closeExcel fn))

 

Tạo 1 file *.xls, ghi ở sheet1 các số liệu tuỳ ý, khoảng chừng 4 cột, 6 hàng. Save và thoát hẳn excel

lần lượt các lệnh từ VD1 đến VD5:

- VD1: lấy dữ liệu trong sheet1, từ cell A1 đến cell D5 của file mà bạn chỉ định và chuyển thành list. Bạn bấm F2 sau khi chạy xong sẽ thấy

- VD2: lấy dữ liệu ở cell B3

- VD3: mở file, tạo sheet mới có tên sheet4

- Vẫn để Excel hiện hành, quay lại Acad gõ VD4 -> Cell B10 sẽ được gán nội dung "How" và cell C10 là "are you?"

- VD5: save và thoát Excel

 

Thông suốt được những cái trên đây thì những functions còn lại không thành vấn đề. Chúng chỉ là những tiện ích hỗ trợ thêm (bạn đọc comments và examples của họ sẽ hiểu)

Khi đã nắm được toàn bộ, bạn sẽ giải quyết được vấn đề đã nêu ở topic "Ghi dữ liệu từ Cad sang file Excel đã có".

Rất, rất cám ơn Ssg, đã mở mang cái đầu ra được đôi chút, nhưng hỏi thêm Ssg chút nữa, ở VD4, nếu không muốn ghi "are you?" vào C10, mà ghi ở E10 thì làm sao?; Làm sao để dữ liệu Cad đưa vào cell do người dùng chọn (như ví dụ trên thì nó luôn ở B10 và C10 đúng không)

  • 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
Rất, rất cám ơn Ssg, đã mở mang cái đầu ra được đôi chút, nhưng hỏi thêm Ssg chút nữa, ở VD4, nếu không muốn ghi "are you?" vào C10, mà ghi ở E10 thì làm sao?; Làm sao để dữ liệu Cad đưa vào cell do người dùng chọn (như ví dụ trên thì nó luôn ở B10 và C10 đúng không)

Ví dụ là... ví dụ! Nó chỉ mang tính minh họa để chúng ta dễ tiếp cận một vấn đề mới. Điều quan trọng là bản chất sự việc, là cái tổng quát mà chúng ta rút ra được từ chúng.

Đoạn code sau đúng theo ý bạn, nhưng nó cũng vẫn là ví dụ!

;;;----------------------------------------------------------------------
(defun C:VD4()
(putcell "B10" "How")
(putcell "E10"  "are you?")
(setq mycell (getstring "\nCell address:"))
(putcell mycell "I'm fine, thank you!")
)
;;;----------------------------------------------------------------------

 

Góp ý: Có lẽ bạn nên dành thời gian thích đáng để tự lập những chương trình lisp cơ bản. Khi đã có nền tảng tương đối vững chắc, bạn quay lại cái này sẽ thấy rất dễ dàng.

  • Vote tăng 2

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

em thấy các bác sử dụng rất nhiều lệnh lạ mà em không biết, bác có tài liệu nào nói về cách sử dụng các lệnh đó không?send cho em với, thanks

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
em thấy các bác sử dụng rất nhiều lệnh lạ mà em không biết, bác có tài liệu nào nói về cách sử dụng các lệnh đó không?send cho em với, thanks

Không biết lệnh lạ theo ý bạn là sao

Mình nghĩ chắc là các lệnh trong lisp, đó là các lệnh do người viết lisp tự đặt ra nên hông giống ai :)

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
Để làm gì hả bạn?

Qua phần giới thiệu xuất giửa Acad sang Excel

Em muốn nhờ anh giúp cho việc xuất số liệu sang Excel cua Cad

Như em có bản vẽ san nền có cao độ tự nhiên ở các mắt lưới, muốn xuất các text đó sang cột dọc ví như từ ô A1....An theo cột dọc A, từ ô B1....Bn theo cột dọc B của Excel phải làm như sao? yêu cầu bấm vào số text. để tính ra cao độ trung bình của từng Ô. ví dụ Sheet 1 CDTN

Và bấm số diện tích để chuyển sang Ô Excel để dùng tính khối lượng, Sheet 2 Khốiluong ô

Em xin nhờ anh giúp.

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
Mình nhờ tất cả các bạn quan tâm đến chủ đề này một việc: kiểm tra giúp đoạn lisp sau có chạy được với mọi version của Acad lẫn Excel hay không (đặc biệt chú trọng đến version của Excel......

TEST ; error: no function definition: GET_XL

cad 2008

excel 2003

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
TEST ; error: no function definition: GET_XL

cad 2008

excel 2003

Cám ơn bạn đã quan tâm. Theo thông báo thì Acad không hiểu function GET_XL, nghĩa là trình lisp không hoàn thành việc load vào memory đúng cú pháp, chưa thể kết luận được. Nguyên nhân bạn Nộ Thiên đã nói trên rồi, việc mã hoá ký tự b đứng kề dấu ) của diễn đàn bị sai lệch.

Bạn vui lòng download lại file này và thử lại, sau đó báo kết quả nhé?

 

http://www.esnips.com/doc/f8166534-fce9-4d...6d5/data_excel2

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ôi có một số ý kiến về việc xuất tọa độ và ghi chú trong phần trắc địa:(Làm tay bo không sử dụng chương trình chuyên dùng)

1. Việc xuất tọa độ và cao độ hoặc ghi chú của các điểm từ file Excel qua Cad là khá đơn giản theo tôi không cần phải lập riêng file Autolisp để sử lý số liệu (mất thời gian). -> Có thể viết luôn trên Excel và sau đó paste qua Cad.

2. Đối với anh em chưa thạo lisp có thể lập một file mẫu Excel từ đó có thể coppy và paste công thức để dùng cho các công trình khác nhau.

Mẫu cơ bản cần có:

- Xuất tọa độ của một điểm (đã biết tọa độ x,y) hặc insert một Block (khi đó Point của bạn có được hình dạng bất kỳ mà bạn muốn, ứng dụng rộng ra bạn có thể đưa được các loại địa vật mà bạn đã đo được trên thực địa)

- Xuất một dòng Text (đã biết nội dung dòng text và vị trí cần thiết để đặt dòng text)

*** 2 ý trên có thể thay bằng việc Insert một Block có thuộc tính ***

- Vẽ đường line hoặc Pline qua các điểm

.....

3. Bạn đo ngoài hiện trường bằng nhiều phương pháp khác nhau nhưng chung quy lại vẫn có thể đưa về dạng tọa độ (vậy tại sao không làm việc này trong Excel) rồi lại làm như khi ta đã có tọa độ.

 

 

Trên đây là một số ý kiến nhỏ của tôi để anh em cùng nghiên cứu và thảo luậ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
Tôi có một số ý kiến về việc xuất tọa độ và ghi chú trong phần trắc địa:(Làm tay bo không sử dụng chương trình chuyên dùng)

1. Việc xuất tọa độ và cao độ hoặc ghi chú của các điểm từ file Excel qua Cad là khá đơn giản theo tôi không cần phải lập riêng file Autolisp để sử lý số liệu (mất thời gian). -> Có thể viết luôn trên Excel và sau đó paste qua Cad.

2. Đối với anh em chưa thạo lisp có thể lập một file mẫu Excel từ đó có thể coppy và paste công thức để dùng cho các công trình khác nhau.

Mẫu cơ bản cần có:

- Xuất tọa độ của một điểm (đã biết tọa độ x,y) hặc insert một Block (khi đó Point của bạn có được hình dạng bất kỳ mà bạn muốn, ứng dụng rộng ra bạn có thể đưa được các loại địa vật mà bạn đã đo được trên thực địa)

- Xuất một dòng Text (đã biết nội dung dòng text và vị trí cần thiết để đặt dòng text)

*** 2 ý trên có thể thay bằng việc Insert một Block có thuộc tính ***

- Vẽ đường line hoặc Pline qua các điểm

.....

3. Bạn đo ngoài hiện trường bằng nhiều phương pháp khác nhau nhưng chung quy lại vẫn có thể đưa về dạng tọa độ (vậy tại sao không làm việc này trong Excel) rồi lại làm như khi ta đã có tọa độ.

 

 

Trên đây là một số ý kiến nhỏ của tôi để anh em cùng nghiên cứu và thảo luận...

 

Nếu chỉ với mục đích trên thì không có vấn đề gì, làm thế nào cũng được, tuỳ thói quen và sở trường của mỗi người, miễn là đạt hiệu quả công việc. Cách làm của bạn cũng được khá nhiều người dùng, nhất là với các bạn thích "chơi" với Excel.

Tuy nhiên, nếu có thể làm chủ được hoàn toàn việc xuất nhập dữ liệu cả 2 chiều: Excel->Cad và Cad->Excel (bằng Lsp, VBA hay Arx thì cũng tuỳ mỗi người), bạn có thể lập nên những ứng dụng hiệu quả hơn thế rất nhiều.

Lý do mất thời gian lập trình của bạn không thuyết phục. Mất thời gian chỉ 1 lần nhưng tiết kiệm được thời gian nhiều lần sau đó. Ngoài ra, nếu bạn có thể share chương trình của mình cho nhiều người khác thì sự mất thời gian đó cũng xứng đáng!

  • 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
Nếu chỉ với mục đích trên thì không có vấn đề gì, làm thế nào cũng được, tuỳ thói quen và sở trường của mỗi người, miễn là đạt hiệu quả công việc. Cách làm của bạn cũng được khá nhiều người dùng, nhất là với các bạn thích "chơi" với Excel.

Tuy nhiên, nếu có thể làm chủ được hoàn toàn việc xuất nhập dữ liệu cả 2 chiều: Excel->Cad và Cad->Excel (bằng Lsp, VBA hay Arx thì cũng tuỳ mỗi người), bạn có thể lập nên những ứng dụng hiệu quả hơn thế rất nhiều.

Lý do mất thời gian lập trình của bạn không thuyết phục. Mất thời gian chỉ 1 lần nhưng tiết kiệm được thời gian nhiều lần sau đó. Ngoài ra, nếu bạn có thể share chương trình của mình cho nhiều người khác thì sự mất thời gian đó cũng xứng đáng!

 

Việc Mất thời gian chỉ tôi chỉ muốn nêu trong trường hợp bài toán cụ thể này vì chỉ dùng các lệnh đơn giản. Đương nhiên tôi đồng ý với bạn viết chương trình, đặc biệt là những việc cần sử lý phức tạp thì cần phải dùng chương trình là tốt nhất.

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
giúp em: Nhập số liệu từ excel rồi xuất bản vẽ sang autocad

http://www.cadviet.com/upfiles/bai_toan.doc

email : Ducmanhgha09@gmail.com

Bạn hãy post lên 2 file.

 

1 file là file Excel đầu vào đã kết xuất ra định dạng CSV.

1 file là file CAD kết quả mà bạn mong muốn sẽ nhận được từ file đầu vào.

 

file word của bạn quá ít thông tin.

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

Kết quả chạy OK. Mình có vài góp ý:

1) Đây là bài toán rất đơn giản với ngôn ngữ lisp. Đoạn lisp sau cho kết quả tương đương với cái bạn đã làm. Appload, gõ lệnh COC, đáp ứng các yêu cầu của chương trình:

(defun C:COC( / H C D Kc Km p1 X Y p2 p3 oldos)
(setq
   H (getint "\nSo hang:")
   C (getint "\nSo cot:")
   D (getreal "\nDuong kinh coc:")
   Kc (getreal "\nKhoang cach cac coc:")
   Km (getreal "\nKhoang cach tu mep be den tim coc:")
   p1 (getpoint "\nBase point:")
   X (+ (* (- C 1) Kc) (* 2 Km))
   Y (+ (* (- H 1) Kc) (* 2 Km))
   p2 (list (+ (car p1) X) (+ (cadr p1) Y))
   p3 (list (+ (car p1) Km) (+ (cadr p1) Km))
   oldos (getvar "osmode")
)
(setvar "osmode" 0)
(command "rectangle" p1 p2)
(command "circle" p3 (/ D 2))
(command "array" (entlast) "" "R" H C Kc Kc)
(setvar "osmode" oldos)
(princ)
)

 

2) Nếu bạn có ý định làm cái này để nghiên cứu và phát triển thêm nhiều ứng dụng phức tạp hơn theo hướng: dùng các công cụ Excel để tính toán và xuất kết quả sang CAD thì mình đề nghị bạn nên chăm chút hơn về hình thức của bảng Excel. Thiết kế bố trí lại các cell, sử dụng màu sắc thật bắt mắt như là một Application. Ngoại trừ các cell để user nhập liệu, các cell còn lại bạn lock toàn bộ, không cho user chỉnh sửa gì. Sau khi nhập liệu, dùng command_button để xuất kết quả sang CAD.

Phát triển ứng dụng theo kiểu này cũng là một hướng rất hay. Chương trình MitCalc chuyên về tính toán thiết kế các chi tiết máy cơ khí là một ví dụ điển hì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

thực ra minh mới bắt tay vào làm VBA nhưng thấy rất hay .Đáng để anh em kỹ thuật ứng dụng vào công viêc của mình

Đây là một file hoàn thiện hơn bao gồm măt bằng và mặt đứng của bệ cọc

Với thông số đầu vào là đk cọc,số hàng số cột,chiều dài cọc và chiều cao bệ cọc

bản vẽ sẽ được tự động vẽ trong autocad

http://www.cadviet.com/upfiles/ung_dung_nen_1.rar

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ực ra minh mới bắt tay vào làm VBA nhưng thấy rất hay .Đáng để anh em kỹ thuật ứng dụng vào công viêc của mình

Đây là một file hoàn thiện hơn bao gồm măt bằng và mặt đứng của bệ cọc

Với thông số đầu vào là đk cọc,số hàng số cột,chiều dài cọc và chiều cao bệ cọc

bản vẽ sẽ được tự động vẽ trong autocad

http://www.cadviet.com/upfiles/ung_dung_nen_1.rar

Mình có vài góp ý sau:

 

1) Nội dung cụ thể bạn làm mình không quan tâm vì nó chẳng phải chuyên ngành của mình. Ngoài ra, các chương trình VB nói chung có một nhược điểm chí mạng: phụ thuộc quá nhiều vào cái đám Libraries -> phụ thuộc vào version của Excel, VB lẫn Acad. Điều đó có nghĩa là, cái bạn làm chạy rất tốt trên máy bạn nhưng khi share cho ai đó thì chưa chắc họ dùng được. Ví dụ, bản thân mình muốn thử chương trình của bạn cũng phải vào Tools - References khai báo lại AutoCAD Type Library. Nếu không, chương trình cứ báo error!

Chính vì thế, đã từ lâu mình không có hứng thú lập trình bằng VB nữa mà chuyển sang "chơi" với Lisp.

Nếu bạn có ý phát triển theo hướng này thì nên chú ý đến vấn đề Version và Libraries

 

2) Về hình thức, bạn đừng bố trí các cell lung tung như vậy mà tập trung nó lại theo một trật tự hợp lý. Trong đó, các cell dành cho nhập liệu gom vào 1 chỗ. Ví dụ như hình sau:

 

becoc.jpg

 

Trong đó:

- Các cells màu xanh lá cây là dành cho user nhập liệu

- Tất cả các cells khác, sau khi gán công thức và hoàn thiện thì lock chúng lại (dùng tính năng protection của Excel). User không thể sửa đổi bất cứ cái gì trong các cells này (nội dung, hình thức lẫn vị trí)

- Các cells ghi kết quả trung gian, ví dụ như kết quả toạ độ các điểm, cho chúng Hide luôn

- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!

Như vậy, file Excel của bạn có dáng dấp của một Application hoàn chỉnh, sử dụng thân thiện và hiệu quả hơn, không bao giờ xảy ra tình trạng user thao tác sai làm mất các công thức đã được gán.

Mà cho dù bạn không có ý phổ biến, tự chế tự dùng đi nữa, chính bạn cũng cảm thấy thoải mái và hiệu quả hơn khi sử dụng.

 

3) Về cung cách coding, bạn đừng viết một mạch từ trên xuống dưới như vậy mà nên chia nhỏ chương trình ra thành nhiều sub, mỗi sub chỉ nên có 1 hoặc vài chức năng nào đó thôi. Những sub có khả năng lặp đi lặp lại trong nhiều chương trình thì nên khái quát hoá chúng (không chứa nội dung cụ thể của 1 bảng Excel cụ thể nào), tạo thành Public Sub, lưu ở cấp độ Modules. Làm như vậy, bạn sẽ dễ check lỗi khi chạy thử cũng như đỡ vất vả hơn khi thiết kế các chương trình lớn và phức tạp 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

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

×