(изменено: Foxx Foxx, 13 февраля 2012г. 10:11:36)

Тема: Связка Autocad и Excel

Здравствуйте! Интересует вопрос как связать Excel и Autocad. Банальный пример: в Excel рассчитываются длины прямоуголльника в зависимости от различных исходных данных. Затем в Autocad требуется нарисовать этот прямоугольник. Как автоматизировать эти действия ?
Office 10 / Autocad 11. Какой способ будет лучше: из Excel управлять автокадом или в автокаде создавать макрос ? В дальнейшем планируется рассчитываеть сложные конструкции зданий и подбирать расстояния, затем в автокаде чертить. Оформление линий по ГОСТ, толщина и т.д. Хотелось автоматизировать эту задачу. Ввели исходные данные, в экселе произведены все расчеты, подобраны расстония и в автокаде готов чертеж. Затем следующие данные и т.д.

Re: Связка Autocad и Excel

Я бы отделил одно от другого:
сначала считываем данные из Экселя,
формируем все это хозяйство в виде списка,
закрываем Эксель и заливаем эти данные в Автокад
Сугубо мое мнение; если скинешь на webfile.ru
свой файл .xls или .xlsx и чертеж (версии не выше 2007)
что должно получиться в итоге, ссылку на файл скинь сюда,
я наверное смогу помочь

(изменено: Foxx Foxx, 13 февраля 2012г. 11:11:29)

Re: Связка Autocad и Excel

Заранее благодарен.
http://webfile.ru/5815215

Re: Связка Autocad и Excel

Пробуй на тех же файлах

;;; demo.lsp
; -- Function emake-pline
; minimum to entmake closed lwpolyline.
; Arguments [Type]:
;   pts = 2d point list [list]
; Return nil
;
(defun emake-pline (pts)
    (entmake
      (append (list (cons 0  "LWPOLYLINE")
        (cons 100  "AcDbEntity")
        (cons 100  "AcDbPolyline")
        (cons 90 (length pts))
        (cons 70  129))
              (mapcar '(lambda (pt)
            (cons 10 pt)) pts)
      )
    )
  )
;
; -- Function MeFormatNums
; Formats the precision of decimal numbers.
; Copyright:
;   ©2001-2005 MENZI ENGINEERING GmbH
; Arguments [Type]:
;   Val = Value [REAL/STR]
;   Pre = Precision [INT]
; Return [Type]:
;   > Formatted value [STR]
; Notes:
;   None
;
(defun MeFormatNums (Val Pre / CurStr DecVal PntPos)
 (setq CurStr (if (= (type Val) 'REAL) (rtos Val 2 Pre) Val)
       PntPos (vl-string-position 46 CurStr)
       PntPos (if (> PntPos 0) PntPos (strlen CurStr))
       DecVal (substr CurStr (+ PntPos 2))
 )
 (repeat (- Pre (strlen DecVal))
  (setq DecVal (strcat DecVal "0"))
 )
 (strcat (substr CurStr 1 PntPos) "." DecVal)
)
; -- Function MeGetExcelVer
; Returns the most recent installed Excel version.
; Copyright:
;   ©2001-2005 MENZI ENGINEERING GmbH
; Arguments [Type]:
;   --- = 
; Return [Type]:
;   > Excel version [STR]
;   > "0" if no valid Excel version installed.
; Notes:
;   - Check for Excel version 8 to 20
;
(defun MeGetExcelVer ( / AppKey MaxVer MinVer RegVal RetVal TmpVal)
 (setq AppKey "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Office\\"
       MinVer 8.0
       MaxVer 20.0
       RetVal "0"
 )
 (while (>= MaxVer MinVer)
  (setq TmpVal (strcat AppKey (MeFormatNums MaxVer 1) "\\Common\\InstallRoot")
        RegVal (if (> MaxVer 8.0)
                (vl-registry-read TmpVal "Path")
                (vl-registry-read TmpVal "OfficeBin")
               )
        RegVal (if (and RegVal (eq (substr RegVal (strlen RegVal)) "\\"))
                (substr RegVal 1 (1- (strlen RegVal)))
                RegVal
               )
  )
  (if (and RegVal (findfile (strcat RegVal "\\Excel.exe")))
   (setq RetVal (rtos MaxVer 2 0)
         MaxVer 0
   )
   (setq MaxVer (1- MaxVer))
  )
 )
 RetVal
)

; -- Function EXD
; return range value as list.
; Copyright:
;   ©2007 fixo * all rights removed
; Arguments [Type]:
;   r1 = first cell address [STR]
;   c1 = last cell address [STR]
; Return [Type]:
;   > Formatted value [list]
; Notes:
;   None
;
(defun EXD (r1 c1 / data excelapp retVal path Sht sheet_name_or_number data_range workbook)
  
  (vl-load-com)
    (setq path (getfiled    "Select Excel file to read :"
            (getvar "dwgprefix")
            "xlsx;xls;csv"
            16
          )
  )
  (setq sheet_name_or_number 1) 
  (setq ExcelApp (vlax-get-or-create-object (strcat "Excel.Application." (MeGetExcelVer))))
  (vla-put-visible ExcelApp :vlax-true)
  (setq Workbook (vl-catch-all-apply 'vla-open
             (list (vlax-get-property ExcelApp "WorkBooks") path)))
         (setq Sht (vl-catch-all-apply 'vlax-get-property
                   (list (vlax-get-property Workbook "Sheets")
                     "Item" sheet_name_or_number)))
      (vlax-invoke-method Sht "Activate")
          (setq data_range (vlax-get-property ExcelApp 'Range
                 (vlax-make-variant r1) (vlax-make-variant c1))
                retVal (vlax-safearray->list (vlax-variant-value
                        (vlax-get-property data_range 'Value))))
(setq data (mapcar (function (lambda (x)(mapcar 'vlax-variant-value x))) retVal))

      (vl-catch-all-apply
    'vlax-invoke-method
    (list Workbook "Close")
      )


    (vl-catch-all-apply
      'vlax-invoke-method
      (list ExcelApp "Quit")
    )



  (mapcar
    (function (lambda (x)
        (if (not (vlax-object-released-p x))
        
          (vlax-release-object x)
        )
          )
    )
    (list data_range Sht WorkBook ExcelApp)
  )
  (setq    data_range nil
    Sht nil
    WorkBook nil
    ExcelApp nil
  )
  (gc)
  (gc)
  
  data
)
; -- Function EXD
; return range value as list.
; Copyright:
;   ©2007 fixo * all rights removed
; Arguments [Type]:
;   r1 = first cell address [STR]
;   c1 = last cell address [STR]
; Return [Type]:
;   > Formatted value [list]
; Notes:
;   None
;
(defun EXR ( / data excelapp retVal path Sht sheet_name_or_number data_range workbook)
  
  (vl-load-com)
    (setq path (getfiled    "Select Excel file to read :"
            (getvar "dwgprefix")
            "xlsx;xls;csv"
            16
          )
  )
  (setq sheet_name_or_number 1) 
  (setq ExcelApp (vlax-get-or-create-object (strcat "Excel.Application." (MeGetExcelVer))))
  (vla-put-visible ExcelApp :vlax-true)
  (setq Workbook (vl-catch-all-apply 'vla-open
             (list (vlax-get-property ExcelApp "WorkBooks") path)))
         (setq Sht (vl-catch-all-apply 'vlax-get-property
                   (list (vlax-get-property Workbook "Sheets")
                     "Item" sheet_name_or_number)))
      (vlax-invoke-method Sht "Activate")
          (setq data_range (vlax-get-property Sht 'UsedRange)
;;;                 (vlax-make-variant r1) (vlax-make-variant c1))
                retVal (vlax-safearray->list (vlax-variant-value
                        (vlax-get-property data_range 'Value))))
(setq data (mapcar (function (lambda (x)(mapcar 'vlax-variant-value x))) retVal))

      (vl-catch-all-apply
    'vlax-invoke-method
    (list Workbook "Close")
      )


    (vl-catch-all-apply
      'vlax-invoke-method
      (list ExcelApp "Quit")
    )



  (mapcar
    (function (lambda (x)
        (if (not (vlax-object-released-p x))
        
          (vlax-release-object x)
        )
          )
    )
    (list data_range Sht WorkBook ExcelApp)
  )
  (setq    data_range nil
    Sht nil
    WorkBook nil
    ExcelApp nil
  )
  (gc)
  (gc)

  data
)
;; Тест:
;;------------------------------------------------;;
(defun C:demo (/ data pt1 pt2 x y)
  ;; 1-й вариант по точкам
(setq data (exd "B3" "C6"))

(emake-pline data)
  ;; 2-й вариант по размерам
 (setq data (exd "F3" "F4"))
  (setq x (caar data)
    y (caadr data)
    )
  (setvar "osmode" 1)
  (setq    pt1 (getpoint "\nУкажи точку: ")
    pt1 (list (car pt1) (cadr pt1))
    pt2 (list (+ (car pt1) x) (+ (cadr pt1)y))
  )
  (command "_rectang" "_W" 0.0 ^C
  "_rectang" "_non" pt1 "_non" pt2)
  
  (princ)
)
(princ  "\n\t\t---\tКоманда на выполнение: DEMO\t---")
(prin1)
(or (vl-load-com)
    (princ))

[FONT=Arial]~'J'~[/FONT]

Re: Связка Autocad и Excel

fixo
Благодарю.

Re: Связка Autocad и Excel

Не за что :)

[FONT=Arial]~'J'~[/FONT]

Re: Связка Autocad и Excel

fixo, здравствуйте!
у меня аналогичная ситуация, но требуется из данных Excel-файла построить поопорный план ЛЭП
excel-файл: http://webfile.ru/5835014
acad-файл: http://webfile.ru/5835017
как видно по акад-файлу необходимо использовать из excel-файла: вкладка Поопорная ведомость; столбцы: опора, тип опоры(где У.. - угловая=треугольник, П.. - прямая=квадрат), высота,угол поворота трассы,длина пролета, нарастающая длина ВЛ.
Помогите, пожалуйста.

Re: Связка Autocad и Excel

Полина Осипенко пишет:

fixo , здравствуйте!
у меня аналогичная ситуация, но требуется из данных Excel-файла построить поопорный план ЛЭП
excel-файл: http://webfile.ru/5835014
acad-файл: http://webfile.ru/5835017
как видно по акад-файлу необходимо использовать из excel-файла: вкладка Поопорная ведомость; столбцы: опора, тип опоры(где У.. - угловая=треугольник, П.. - прямая=квадрат), высота,угол поворота трассы,длина пролета, нарастающая длина ВЛ.
Помогите, пожалуйста.

Для начала попробуй
Сперва открой нужный лист в Экселе и выдели номера строк
удеживая левую клаву, как выделишь сохрани Эксель и закрой
Потом вот это:

;opory.lsp
;
; -- Function emake-pline
; minimum to entmake closed lwpolyline.
; Arguments [Type]:
;   pts = 2d point list [list]
; Return nil
;
(defun emake-pline (pts)
    (entmake
      (append (list (cons 0  "LWPOLYLINE")
        (cons 100  "AcDbEntity")
        (cons 100  "AcDbPolyline")
        (cons 90 (length pts))
        (cons 70  129))
              (mapcar '(lambda (pt)
            (cons 10 pt)) pts)
      )
    )
  )

;
; -- Function MeFormatNums
; Formats the precision of decimal numbers.
; Copyright:
;   ©2001-2005 MENZI ENGINEERING GmbH
; Arguments [Type]:
;   Val = Value [REAL/STR]
;   Pre = Precision [INT]
; Return [Type]:
;   > Formatted value [STR]
; Notes:
;   None
;
(defun MeFormatNums (Val Pre / CurStr DecVal PntPos)
 (setq CurStr (if (= (type Val) 'REAL) (rtos Val 2 Pre) Val)
       PntPos (vl-string-position 46 CurStr)
       PntPos (if (> PntPos 0) PntPos (strlen CurStr))
       DecVal (substr CurStr (+ PntPos 2))
 )
 (repeat (- Pre (strlen DecVal))
  (setq DecVal (strcat DecVal "0"))
 )
 (strcat (substr CurStr 1 PntPos) "." DecVal)
)
;
; -- Function MeGetExcelVer
; Returns the most recent installed Excel version.
; Copyright:
;   ©2001-2005 MENZI ENGINEERING GmbH
; Arguments [Type]:
;   --- = 
; Return [Type]:
;   > Excel version [STR]
;   > "0" if no valid Excel version installed.
; Notes:
;   - Check for Excel version 8 to 20
;
(defun MeGetExcelVer ( / AppKey MaxVer MinVer RegVal RetVal TmpVal)
 (setq AppKey "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Office\\"
       MinVer 8.0
       MaxVer 20.0
       RetVal "0"
 )
 (while (>= MaxVer MinVer)
  (setq TmpVal (strcat AppKey (MeFormatNums MaxVer 1) "\\Common\\InstallRoot")
        RegVal (if (> MaxVer 8.0)
                (vl-registry-read TmpVal "Path")
                (vl-registry-read TmpVal "OfficeBin")
               )
        RegVal (if (and RegVal (eq (substr RegVal (strlen RegVal)) "\\"))
                (substr RegVal 1 (1- (strlen RegVal)))
                RegVal
               )
  )
  (if (and RegVal (findfile (strcat RegVal "\\Excel.exe")))
   (setq RetVal (rtos MaxVer 2 0)
         MaxVer 0
   )
   (setq MaxVer (1- MaxVer))
  )
 )
 RetVal
)

;
(defun ru-text-entmake (txt pnt height rotation justification / ent_list)
  ;;;ShaggyDoc
  ;;;https://www.caduser.ru/forum/topic30276.html
  (setq   ent_list (list   '(0 . "TEXT")
      '(100 . "AcDbEntity")
      '(100 . "AcDbText")
      (list 10 (car pnt) (cadr pnt) 0.0)
      (cons 1 txt)
      (cons 40 height)
      (cons 7 (getvar "textstyle"))
      (if justification
        (cond
          ((= justification "C")
           '(72 . 1)
          )
          ((= justification "R")
           '(72 . 2)
          )
          ((= justification "A")
           '(72 . 3)
          )
          ((= justification "M")
           '(72 . 4)
          )
          ((= justification "F")
           '(72 . 5)
          )
          (t
           '(72 . 0)
          )
        ) ;_ end of cond
        '(72 . 0)
      ) ;_ end of if
      (cons 50 rotation)
      (list 11 (car pnt) (cadr pnt) 0.0)
     ) ;_ end of list
   ) ;_ end of setq
   (entmakex ent_list)
)

;
; -- Function EXS
; Read selection and return its value as a list.
; Copyright:
;   ©2007 fixo * all rights removed
; Arguments [None]:
; Return [Type]:
;   > Formatted value [list]
; Notes:
;   None
;
(defun EXS (/ data excelapp retVal path data_range workbook)
  
  (vl-load-com)
    (setq path (getfiled    "Select Excel file to read :"
            (getvar "dwgprefix")
            "xls;xlsx;xlsm"
            16
          )
  )

  (setq ExcelApp (vlax-get-or-create-object (strcat "Excel.Application." (MeGetExcelVer))))
  (vla-put-visible ExcelApp :vlax-true)
  (setq Workbook (vl-catch-all-apply 'vla-open
             (list (vlax-get-property ExcelApp "WorkBooks") path)))

          (setq data_range (vlax-get-property ExcelApp 'Selection)

                retVal (vlax-safearray->list (vlax-variant-value
                        (vlax-get-property data_range 'Value))))
(setq data (mapcar (function (lambda (x)(mapcar 'vlax-variant-value x))) retVal))

      (vl-catch-all-apply
    'vlax-invoke-method
    (list Workbook "Close")
      )


    (vl-catch-all-apply
      'vlax-invoke-method
      (list ExcelApp "Quit")
    )



  (mapcar
    (function (lambda (x)
        (if (not (vlax-object-released-p x))
        
          (vlax-release-object x)
        )
          )
    )
    (list data_range  WorkBook ExcelApp)
  )
  (setq    data_range nil
    WorkBook nil
    ExcelApp nil
  )
  (gc)
  (gc)
  
  data
)
;
;; Тест:
;
;;---------------------------------------------------------------------------;;
(defun C:YO (/ data dlinatr levels n nameop nord numop p sumdlina texts ugolop ugoltr vysota west x)
(alert (strcat "Перед запуском этой программы:\n"
           "Окрыть файл Эксель,\n"
           "Выделить номера нужных строк,\n"
           "Сохранить файл Эксель и закрыть"))
(setq data (exs))
  ;;
(setq data (mapcar '(lambda(x)(vl-remove-if 'not x)) data))

  (setq levels (list 1.0 6.0 11.0 17.0));   --- расстояние по высоте между текстами
  ;;Построчно все столбцы:
  (foreach record data
    (setq numop (car record)
      nameop (nth 1 record)
      ugolop (nth 2 record)
      nord (nth 3 record)
      west (nth 4 record)
      vysota (nth 5 record)
      ugoltr (nth 6 record)
      dlinatr (nth 7 record)
      sumdlina (nth 8 record)
;; ---   здесь добавь что надо плюс вычисления и тд   ---  ;;
)
    
    ;; для примера рисуем текст столбцом
    (setq texts (list numop sumdlina dlinatr vysota));   --- выбранные текстовые данные
    (setq p (getpoint "\Указать точку : "))
    (setq n 0)
    (foreach yd levels
      
    (ru-text-entmake (nth n texts)(list (car p) (+ (cadr p)yd) 0.0) 2.0 0.0 nil)
      (setq n (1+ n))
    )
    )


  (princ)
)
(princ  "\n\t\t---\tКоманда на выполнение: YO\t---")
(prin1)
(or (vl-load-com)
    (princ))

[FONT=Arial]~'J'~[/FONT]

Re: Связка Autocad и Excel

fixo спасибо
а можно все эти функции с подробнейшими комментариями  :D пожалуйста, а то самой в этом всем разбираться тяжеловато, а на носу диплом... :cry:

Re: Связка Autocad и Excel

Полина Осипенко пишет:

fixo  спасибо
а можно все эти функции с подробнейшими комментариями   пожалуйста, а то самой в этом всем разбираться тяжеловато, а на носу диплом...

У меня 8 классов всего, что я могу объснить
В редакторе открой лисп, выдели любую функцию
и нажми F1 все увидишь в справке,
больше ничем не могу помочь

[FONT=Arial]~'J'~[/FONT]

(изменено: Александр, 11 июня 2013г. 14:15:21)

Re: Связка Autocad и Excel

http://webfile.ru/6559791

fixo,
Доброго времени! Впринципе у меня такая же ситуация, только еще с различными подписюльками

Идея создания макроса летает в воздухе давно...

Имеется сводная таблица (файл "сводная")
с различными данными (описание каждого столбца в файле "описание").
Увы, не умею пользоваться (кто бы научил)) макросами как Экселя, так и Автокада.
Так вот, необходимо получать заготовки в одном файле (файл "заготовки) именно в таком виде.

Очень нужна помощь, ибо иной раз приходиться таковых делать по 300-500 штук. А рук не хватает.
Спасибищее!

Re: Связка Autocad и Excel

Александр пишет:

Очень нужна помощь, ибо иной раз приходиться таковых делать по 300-500 штук. А рук не хватает.

Я не могу сейчас физически очень занят,
вернусь позже

Re: Связка Autocad и Excel

fixo,
Мне эта помощь нужна не срочно, а в принципе... Пока по старинке в ручную))

Re: Связка Autocad и Excel

Попробуй, смотри что будет в командной строке,
Эксель лучше открыть а потом запусти этот лисп

;; SKV.lsp
(defun GetXlRangeByMatch(filename sheetname skv_id / all_skvs xlbook xlrange xlsheet xlapp skv_records)
  
  (vl-load-com)

  
    (setq xlapp(vlax-get-or-create-object "Excel.Application"))
    (vla-put-visible xlapp :vlax-false)
    (vlax-put-property xlapp 'DisplayAlerts :vlax-false)
  (if (zerop (vlax-get-property(vlax-get-property xlapp 'workbooks) 'count))
     (setq xlbook (vl-catch-all-apply
        'vla-open
        (list (vlax-get-property xlapp 'WorkBooks) fileName)
        )
      )
  (setq xlbook (vl-catch-all-apply 'vlax-get-property (list xlapp 'activeworkbook))))


(setq xlsheet (vl-catch-all-apply
        'vlax-get-property
        (list (vlax-get-property xlbook 'Sheets)
          'Item
          1 ;|"список"|;;< --- sheet name or number
          )
        )
      )
  
    (vlax-invoke-method xlsheet 'Activate)
  
 (setq xlrange (vlax-get-property xlsheet 'usedrange))
 (setq all_skvs (vlax-get-property xlrange 'value2))
 (setq all_skvs(mapcar '(lambda(x)(mapcar 'vlax-variant-value x)) (vlax-safearray->list (vlax-variant-value all_skvs))))
 (setq skv_records (vl-remove-if-not '(lambda (x)(eq skv_id (car x)))all_skvs))

   (vl-catch-all-apply 'vlax-invoke-method (list xlbook 'Close :vlax-false))
  (vlax-put-property xlapp 'DisplayAlerts :vlax-true)
  (gc);; before QUIT
    (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'Quit))
  (mapcar '(lambda(x)(if (and x (not (vlax-object-released-p x)))
               (progn(vlax-release-object x)(setq x nil))))
      (list xlrange xlsheet xlbook xlapp))
  
  (gc);; after QUIT

      skv_records
  )


(defun C:SKV(/ filename mydata sheetname)

           (setq filename
              ;; change full path name if not working: 
              (findfile "сводная.xls") ;_ end of findfile
           ) ;_ end of setq
           (setq sheetname "список");|1|;
          (setq skv_id "С-1")
  (setq mydata (GetXlRangeByMatch filename sheetname skv_id))
  
  (print mydata)

(princ)
  )
(prompt
  "\n\t\t---\tType SKV for the quick test \t---")
(prin1)
(or (vl-load-com)(princ))




Дальше сам?

Re: Связка Autocad и Excel

fixo,
В этом то и проблема, я в этом ничего не понимаю((
Запустить Лисп то могу, и только.

запустил. Только не пойму, что и где должно было появиться^^

Re: Связка Autocad и Excel

Посмотри что возвращает в командной строке,
я смогу помочь только на следующей неделе,
две больших программы на очереди

Re: Связка Autocad и Excel

fixo,
Я всё-таки желаю дождаться.
Но и попробую поразбираться.

Re: Связка Autocad и Excel

Александр пишет:

fixo, 

Я всё-таки желаю дождаться.

Но и попробую поразбираться.

Ты не ответил,
Что в командной строке?

(изменено: fixo, 24 июня 2013г. 18:05:01)

Re: Связка Autocad и Excel

Короче пробуй (для единичной скв. )

Код изменен


;; SKV.lsp
(defun c:skv(/ *error* emake_circle emake_ltext emake_mctext emake_insert_no_rot GetXlRangeByMatch blk_loc
         blk_name blk_names blk_pts blk_ys coeff deep filename hs mydata n p pe
         p1 p2 pos ps pt q sheetname skv_id text_points tht tick_pts tick_ys txt_levels wid x y)
(defun *error* (msg)
  (if msg (princ msg))
  (vla-endundomark
    (vla-get-activedocument (vlax-get-acad-object))
  ) ;_ end of vla-endundomark
  (princ)
) ;_ end of defun



  
;;helpers: 

(defun GetXlRangeByMatch(filename sheetname skv_id / all_skvs xlbook xlrange xlsheet xlapp skv_records)
  
  (vl-load-com)

  
    (setq xlapp(vlax-get-or-create-object "Excel.Application"))
    (vla-put-visible xlapp :vlax-false)
    (vlax-put-property xlapp 'DisplayAlerts :vlax-false)
  (if (zerop (vlax-get-property(vlax-get-property xlapp 'workbooks) 'count))
     (setq xlbook (vl-catch-all-apply
        'vla-open
        (list (vlax-get-property xlapp 'WorkBooks) fileName)
        )
      )
  (setq xlbook (vl-catch-all-apply 'vlax-get-property (list xlapp 'activeworkbook))))


(setq xlsheet (vl-catch-all-apply
        'vlax-get-property
        (list (vlax-get-property xlbook 'Sheets)
          'Item
          1 ;|"список"|;;< --- sheet name or number
          )
        )
      )
  
    (vlax-invoke-method xlsheet 'Activate)
  
 (setq xlrange (vlax-get-property xlsheet 'usedrange))
 (setq all_skvs (vlax-get-property xlrange 'formulalocal));|was 'value2|;
 (setq all_skvs(mapcar '(lambda(x)(mapcar 'vlax-variant-value x)) (vlax-safearray->list (vlax-variant-value all_skvs))))
 (setq skv_records (vl-remove-if-not '(lambda (x)(eq skv_id (car x)))all_skvs))
(setq skv_records (mapcar '(lambda (x)(mapcar 'vl-princ-to-string x))skv_records))
   (vl-catch-all-apply 'vlax-invoke-method (list xlbook 'Close :vlax-false))
  (vlax-put-property xlapp 'DisplayAlerts :vlax-true)
  (gc);; before QUIT
    (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'Quit))
  (mapcar '(lambda(x)(if (and x (not (vlax-object-released-p x)))
               (progn(vlax-release-object x)(setq x nil))))
      (list xlrange xlsheet xlbook xlapp))
  
  (gc);; after QUIT

      skv_records
  )
 (defun emake_insert_no_rot (blk_name pt)
(entmakex
        (list 
            (cons 0 "INSERT")
            (cons 100 "AcDbEntity")
            (cons 100 "AcDbBlockReference")
            (cons 2 blk_name)
            (cons 8 "0")
            (cons 10 pt)
            (cons 50 0.0)
            (cons 70 0)
            (cons 66 0)
        )
    )
  
    (entmake
        (list
            (cons 0 "SEQEND")
            (cons 8 "0")
        )
    )
  (princ)
  )
  
 (defun    emake_mctext (pt tht txt style)
   (entmakex
     (list
       '(0 . "TEXT")
       '(100 . "AcDbEntity")
       '(8 . "0")
       '(100 . "AcDbText")
       (cons 10 (list (car pt) (- (cadr pt) (/ tht 2)) 0.0))
       (cons 11 pt)
       (cons 40 tht)
       (cons 1 txt)
       '(50 . 0.0)
       '(41 . 1.0)
       '(51 . 0.0)
       '(7 . "Standard")
       '(71 . 0)
       '(72 . 1)
       (cons 210 (list 0.0 0.0 1.0))
       '(73 . 2)
     ) ;_ end of list
   ) ;_ end of entmakex
 ) ;_ end of defun



  
  (defun emake_ltext (pt tht txt style)
    (entmakex
      (list (cons 0 "TEXT")
        (cons 100 "AcDbEntity")
        (cons 8 "0")
        (cons 100 "AcDbText")
        (cons 10 pt)
        (cons 40 tht)
        (cons 1 txt)
        (cons 50 0.0)
        (cons 41 1.0)
        (cons 51 0.0)
        (cons 7 style)
        (cons 71 0)
        (cons 72 0)
        (cons 11 (list 0.0 0.0 0.0))
        (cons 210 (list 0.0 0.0 1.0))
        (cons 100 "AcDbText")
        (cons 73 0)
      ) ;_ end of list
    ) ;_ end of entmakex
  ) ;_ end of defun

  
(defun emake_circle (cen rad)
  (entmakex (list (cons 0 "CIRCLE")
          (cons 100 "AcDbEntity")
          (cons 8 "0")
          (cons 100 "AcDbCircle")
          (cons 10 cen)
          (cons 40 rad)
        ) ;_ end of list
  ) ;_ end of entmakex
) ;_ end of defun

  ;;                 main part                ;;
  
           (setq filename
              ;; change full path name if not working: 
              (findfile "сводная.xls") ;_ end of findfile
           ) ;_ end of setq
           (setq sheetname "список");|1|;
          (setq skv_id "С-8")
  (setq mydata (GetXlRangeByMatch filename sheetname skv_id))

  ;; put black hole:
  (if (not mydata)(progn (alert "Problem reading Excel file, exit...")(exit)(princ)))
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setvar "dimzin" 0)
;; initial point
(setq pt (getpoint "\n Pick a point: "))
(setq pe pt)
(initget 6)
(setq tht (getreal "\n Text height: <2>: "))
(and (not tht)(setq tht 2.0))

(setq coeff 10.)
(setq mydata(vl-sort mydata '(lambda (m n)(< (caddr m)(caddr n)))))

(setq hs (* coeff (apply 'max (mapcar 'atof(mapcar 'cadr mydata)))) wid 1.0)

(setq p1(mapcar '+ pt (list (* -1 wid)(* -1 hs)))
      p2 (mapcar '+ (list wid 0.) pt))
(command "_rectang" "_non" p1 "_non" p2)

;; Left side blocks
;; Y's by left side 
(setq blk_ys (mapcar '(lambda (p)(mapcar '(lambda (q)(if q (* -1 coeff q)))p))
    (mapcar 'last (mapcar'(lambda (x)
                (list (reverse (cdr (reverse x)))
                      (read (strcat "("(last x)")"))))
                 mydata )
        )
    )
)
;; remove the first line 
(setq blk_ys (vl-remove-if 'not(vl-remove-if 'not blk_ys)))


;; block coordinates at left side 
(setq blk_pts (mapcar '(lambda (x)(mapcar '(lambda (y)(mapcar '+ pt (list 5.5 y)))  x)) blk_ys))

;; join with appropriate blocks
(setq blk_names (mapcar '(lambda (x)(nth 4 x))(cdr mydata)))
(setq blk_names (mapcar '(lambda (x) (cond (( wcmatch (strcase x) "*ТОРФ*") "obr")
              (( wcmatch (strcase x) "*ПЕСОК*") "monol")
              (T "")))blk_names ))


(setq blk_loc (mapcar '(lambda (x y)(cons x y)) blk_names blk_pts))

(foreach blk_line blk_loc
  (setq blk_name (car blk_line))
  (foreach pp (cdr blk_line)
    (emake_insert_no_rot blk_name (trans pp 1 0))
;(command "_.-insert" blk_name "_non" pt 1 1 0.0)
    )
  )

;;Left side texts
(setq txt_levels(mapcar '(lambda(x)(rtos (atof (nth 6 x)) 2 1)) mydata))
(setq tick_ys (mapcar '(lambda(x)(* -1 coeff (atof(nth 6 x))))mydata))
(setq tick_pts (mapcar '(lambda(x)(mapcar '+ pt (list (* -1 wid) x)))tick_ys))
(setq n 0)
(foreach pp tick_pts
  (command "_line" "_non" pp "_non" (mapcar '+ pp (list (* 2 wid) 0.)) "")

(emake_ltext (mapcar '+ pp (list (* 2.75 wid) (* -1 tht))) tht (nth n txt_levels) "Standard")
(setq n (1+ n)))

;; Right side text
(setq text_points (mapcar '(lambda(x)(list (nth 3 x)(mapcar '+ pt (list -6.0 (* -1 coeff(/ (+ (atof(nth 5 x))(atof(nth 6 x))) 2.))))))mydata))
(setq text_points (vl-remove-if '(lambda(x)( eq "-" (car x)))text_points))
(foreach pp text_points
  (if (eq "5м" (car pp))
    (progn
     ( emake_circle (cadr pp) (* 1.35 tht))
  (emake_mctext (cadr pp) tht (car pp) "Standard"))
(emake_mctext (cadr pp) tht (car pp) "Standard")))

  
;; upper text notes
(setq pe (mapcar '+ p1 (list wid  -8.5)))
(emake_mctext pe tht skv_id "Standard")
(setq pe (mapcar '+ pe (list 0.0 (* -2 tht))))
(setq deep (rtos (apply 'max (mapcar 'atof(mapcar 'cadr mydata))) 2 2))
(emake_mctext pe tht deep "Standard")
(setq ps (mapcar '+ pe (list (* -0.5 (* (strlen deep)(* 0.5 tht))) tht)))
(setq pe (mapcar '+ pe (list (* 0.5 (* (strlen deep)(* 0.5 tht))) tht)))
(command "_line" "_non" (trans ps 1 0) "_non" (trans pe 1 0) "")
(*error* nil)
(princ)
  )
(prompt
  "\n\t\t---\tType SKV for the quick test \t---")
(prin1)
(or (vl-load-com)(princ))

Re: Связка Autocad и Excel

fixo,
что-то ошибку выдает: 'Problem reading Excel file, exit'(c)
(эксель перед началом работы открываю, файл "сводная")

И это печалит......

Re: Связка Autocad и Excel

Александр пишет:

fixo, 
что-то ошибку выдает: 'Problem reading Excel file, exit'©
(эксель перед началом работы открываю, файл "сводная")

И это печалит......

Пробуй еще раз, я неправильно скопировал,
или измени на полный путь файла Эксель

Re: Связка Autocad и Excel

fixo,
не могу разобраться...((
а можно уже измененный xls-файл?

Re: Связка Autocad и Excel

Попробуй для начала со старым: запустить код из редактора,
открой файл в редакторе и потом
только добавь ниже всего кода строчку:

(C:SKV)

Затем в меню Debug поставь галку на поле 'Debug on Error'
потом иди в меню 'Tools' кликни на поле 'Load Text From Editor'
если будет ошибка сразу обратно в редакторе в меню 'Debug'
кликни на поле 'Last Error Source' и увидишь где что болит
Скажешь мне где

Re: Связка Autocad и Excel

fixo,
провернул сие...

(if (not mydata)(progn (alert "Problem reading Excel file, exit...")(exit)(princ)))
в данной строчке выделил "(exit)"

Re: Связка Autocad и Excel

Понятно, значит не читает Эксель файл,
либо там другое форматирование либо еще чего
надо проверять, попробуй заменить эту строчку:

(setq all_skvs (vlax-get-property xlrange 'formulalocal));|was 'value2|;

на эту:

(setq all_skvs (vlax-get-property xlrange 'value2))

если не читает, тогда скинь другой файл Эксель, о котором идет речь
Еще какая версия Эксель и Винды (32 или 64)?