Schöck
Показать сообщение отдельно
 
Непрочитано 14.12.2011, 17:01
1 | #11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,801
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
допустим А1 конкретной таблицы (известен ее ID)? Не могу разобраться с синтаксисом
По ID получить vla-object
Код:
[Выделить все]
;;;ObID - число, например 2130534448
(vla-objectidtoobject(vla-Get-ActiveDocument (vlax-Get-Acad-Object)) ObID)
;;;ObjID - строка, например "2130534448"
(vla-objectidtoobject(vla-Get-ActiveDocument (vlax-Get-Acad-Object))(read ObID))
Код:
[Выделить все]
(defun get_cell_value ( tblobj ExcellColumn )
  ;;; tblobj - vla-object 
  ;;; ExcellColumn - string - "A1" B2"
  ;;; Use
  ;;; (get_cell_value (vlax-ename->vla-object(car(entsel))) "A2")
  (apply
  '(lambda ( col row )
     (vla-GetText tblobj (1- row) (1-(Alpha2Number  col)))
     )
  (mip-string-text-and-number (strcase ExcellColumn))
  )
  )
(defun Alpha2Number (Str$ / Num#)
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
  (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
(defun Number2Alpha (Num# / Val#)
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
  (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
(defun mip-string-text-and-number (s)
;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
* Тэги: строка число извлечь число цифры
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
* http://forum.dwg.ru/showthread.php?p=285510#post285510
* http://forum.dwg.ru/showpost.php?p=677452&postcount=12
* http://www.theswamp.org/index.php?topic=22034.msg266541#msg266541
* http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/how-to-read-list-with-quotes-in-string/td-p/2365087/page/2
***************************************************************************************
* Пример использования и результатов работы:
* (str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (str->list "qvf12qsdf125 5sf 56dfv2") => ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2)
***************************************************************************************
 |;
 (defun str->list1 (a b f)
  (cond
   ((null b)
    (list (if f
           (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           )
           (vl-list->string (reverse a))
          )
    )
   )
   (f
    (if (or (= (car b) 44) (< 45 (car b) 58))
     (str->list1 (cons (car b) a) (cdr b) f)
     (cons (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           )
           (str->list1 (list (car b)) (cdr b) nil)
     )
    )
   )
   (t
    (if (< 47 (car b) 58)
     (cons (vl-list->string (reverse a)) (str->list1 (list (car b)) (cdr b) t))
     (str->list1 (cons (car b) a) (cdr b) nil)
    )
   )
  )
 )
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             )
 )
)
Цитата:
Сообщение от skkkk Посмотреть сообщение
Это слишком трудоемко?
Нет
Код:
[Выделить все]
(get_cell_value
  (vlax-ename->vla-object
    (car
      (entsel "\nВыберите таблицу")
      )
    )
  "A2"
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 14.12.2011 в 17:20.
VVA на форуме  
 
Tekla Structures. Видеокурс. ЖЕЛЕЗОБЕТОН
Размещение рекламы