| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Извлечение масштабного коэффициента

Извлечение масштабного коэффициента

Ответ
Поиск в этой теме
Непрочитано 29.08.2012, 06:53 #1
Извлечение масштабного коэффициента
Jonas
 
конструктор машиностроитель
 
Новосибирск
Регистрация: 14.05.2007
Сообщений: 893

Для извлечения масштабного коэффициента я использую следующее лисп-выражение -
Код:
[Выделить все]
 (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE))))
Нужно мне это для продолжения жизни старых программ написанных до появления аннотативности.
Вот пример части кода -
Код:
[Выделить все]
  (setq pnt1 (getpoint "\nТочка вставки")
	 ;;;точка вставки первого текста
         pnt2 (list (+ (car pnt1) (* (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))) 1.0))
		    (+ (cadr pnt1) (* (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))) 2.0)))
	 ;;;точка вставки второго текста
         pnt3 (list (+ (car pnt1) (* (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))) 35.0))
		    (+ (cadr pnt1) (* (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))) 2.0)))
   )
   ;;;коэффициенты длины текстов
   (setq kolzn (strlen str2) kolzn1 (strlen str3) dl1 (* (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))) 2.0 kolzn1))
  
   (if (> kolzn  2.8) (setq koef 2.0) (setq koef 2.0))
   (setq dl2 (* koef kolzn  (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))))) 
Проблема в том, что при CANNOSCALE 1:1 результат извлечения 0,0 и программа не работает.
Научите, как решить эту проблему, получать результат 1,0.
Просмотров: 4246
 
Непрочитано 29.08.2012, 08:02
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


(if
gomer вне форума  
 
Автор темы   Непрочитано 29.08.2012, 12:20
#3
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Спасибо за помощь!
Теперь код выглядит так -
Код:
[Выделить все]
  (setq cc (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))))
    
   (setq pnt1 (getpoint "\nÒî÷êà âñòàâêè") 
         pnt2 (list (+ (car pnt1) (*  (if (< 1 cc)cc 1)  1.0))
                    (+ (cadr pnt1) (*  (if (< 1 cc)cc 1) 2.0)))
         pnt3 (list (+ (car pnt1) (*  (if (< 1 cc)cc 1) 35.0 ))
		    (+ (cadr pnt1) (*  (if (< 1 cc)cc 1) 2.0)))
   )
   (setq kolzn (strlen str2) kolzn1 (strlen str3) dl1 (* 2.0  (if (< 1 cc)cc 1) kolzn1)) 
   (if (> kolzn 28) (setq koef 1.85) (setq koef (*  (if (< 1 cc)cc 1) 2.6)))
   (setq dl2 (* koef kolzn)) 
Всё работает, замечательно.
Jonas вне форума  
 
Непрочитано 29.08.2012, 12:37
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Я из принципа в CANNOSCALE 1:1 засуну масштаб 1:15.6 - и каков будет результат?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.08.2012, 12:43
#5
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Кому нужны такие принципы?
А если уж действительно нужно будет, будем решать с божей и Вашей помощью.
Jonas вне форума  
 
Непрочитано 29.08.2012, 14:15
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Принципиальное решение (без подробностей):
Код:
[Выделить все]
 (defun _kpblc-scale-get-annotation (doc / dict res)
                                   ;|
*    Получение масштаба аннотаций для указанного документа.
|;
  (if (not doc)
    (setq doc *kpblc-adoc*)
    ) ;_ end of if
  (cond
    ((= (type
            (setq dict (vl-catch-all-apply (function (lambda () (vla-item (vla-get-dictionaries doc) "acad_scalelist")) ;_ end of lambda
                                                     ) ;_ end of function
                                           ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
            ) ;_ end of type
          'vla-object
          ) ;_ end of =
     ((lambda (/ elist)
        (setq elist (entget (vlax-vla-object->ename
                              (car (vl-remove-if-not '(lambda (x)
                                                        (= (cdr (assoc 300 (entget (vlax-vla-object->ename x)))) ;_ end of cdr
                                                           (vlax-variant-value (vla-getvariable doc "cannoscale")) ;_ end of vlax-variant-value
                                                           ) ;_ end of =
                                                        ) ;_ end of lambda
                                                     (_kpblc-conv-vla-to-list dict)
                                                     ) ;_ end of vl-remove-if-not
                                   ) ;_ end of car
                              ) ;_ end of vlax-vla-object->ename
                            ) ;_ end of entget
              ) ;_ end of setq
        (/ (cdr (assoc 141 elist)) (cdr (assoc 140 elist)))
        ) ;_ end of lambda
      )
     )
    ((setq
       dict (car
              (vl-remove-if-not
                (function (lambda (a)
                            (= (strcase (_kpblc-conv-value-to-string (_kpblc-get-ent-name a)) ;_ end of _kpblc-conv-value-to-string
                                        ) ;_ end of strcase
                               "AEC_VARS_DWG_SETUP"
                               ) ;_ end of =
                            ) ;_ end of lambda
                          ) ;_ end of function
                (_kpblc-conv-vla-to-list
                  (car (vl-remove-if-not (function (lambda (x)
                                                     (= (strcase (_kpblc-conv-value-to-string (_kpblc-get-ent-name x)) ;_ end of _kpblc-conv-value-to-string
                                                                 ) ;_ end of strcase
                                                        "AEC_VARS"
                                                        ) ;_ end of =
                                                     ) ;_ end of lambda
                                                   ) ;_ end of function
                                         (_kpblc-conv-vla-to-list (vla-get-dictionaries doc)) ;_ end of _kpblc-conv-vla-to-list
                                         ) ;_ end of vl-remove-if-not
                       ) ;_ end of car
                  ) ;_ end of _kpblc-conv-vla-to-list
                ) ;_ end of vl-remove-if-not
              ) ;_ end of car
       ) ;_ end of setq
     (setq res (cdr (assoc 42 (entget (_kpblc-conv-ent-to-ename dict)))))
     )
    (t 1.)
    ) ;_ end of cond
  ) ;_ end of defun
Мусора многовато, но вычищать некогда
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.08.2012, 20:50
#7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Идея та же, что и у Алексея, но без vla-*
Код:
[Выделить все]
(defun get-scalelist ( scale / ret )
  ;;;Scale - имя мпасштаба (setq scale (getvar "CANNOSCALE"))
  ;;; возвращает список (имя_масштаба к1 к2)
  ;;Пример (get-scalelist (getvar "CANNOSCALE"))
  (foreach sc (dictsearch (namedobjdict) "acad_scalelist")
  (if (and (= (car sc) 350)
           (setq sc (entget(cdr sc)))
           (eq(cdr(assoc 300 sc)) scale)
           )
    (setq ret (list (cdr(assoc 300 sc))(cdr(assoc 140 sc))(cdr(assoc 141 sc))))
    )
  )
  ret
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 30.08.2012, 06:07
#8
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Окончательно сделал так -

Код:
[Выделить все]
 (setq cc (float (atoi  (vl-string-left-trim "1:"  (getvar 'CANNOSCALE)))))
  (setq cc1  (if (< 1 cc)cc 1) )
Всё нормально работает.

Если вам не трудно, в двух словах, что плохо и какие преимущества в ваших вариантах.
Масштаб 1:15,6 не предусмотрен ГОСТом поэтому рассматривать не стоит.
Jonas вне форума  
 
Непрочитано 30.08.2012, 09:20
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


От обезьяны с гранатой никто не застрахован. Наши варианты возвращают по имени масштаба его масштабные коэффициенты. Помимо масштаба 1:xxx есть масштабы 2:1 и т.д
В твоем случае фрагмент кода мог бы выглядеть так
Код:
[Выделить все]
;;;функцию get-scalelist см пост #7
;;; http://forum.dwg.ru/showpost.php?p=965027&postcount=7
(setq cc (get-scalelist (getvar "CANNOSCALE")))
(if (= (cadr cc) 1) ;_если масштаб 1:NN
  (progn
    (setq cc1 (caddr cc))
    (setq cc1  (if (< 1 cc) cc 1))
    )
  (alert "Масштаб должен быть\n    1:NN")
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.08.2012, 09:21
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Jonas, создай пользовательский масштаб, назови его 1:2000, единиц модели - 1, единиц листа - 2. Какое значение масштаба получишь ты и какое оно на самом деле?
Второй вариант: имя масштаба 1:500, единиц модели - 2, единиц листа - 1. Вопрос тот же.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.08.2012, 11:12
#11
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от VVA Посмотреть сообщение
Помимо масштаба 1:xxx есть масштабы 2:1 и т.д
Да, это хорошо, правда для тех кто их пользует (например часощики, или приборостроители).
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
создай пользовательский масштаб, назови его 1:2000, единиц модели - 1, единиц листа - 2.
Зачем создавать масштаб который называется иначе, разве что чтобы конкуренты не догадались.

Спасибо за разъяснения.
Jonas вне форума  
 
Непрочитано 30.08.2012, 11:17
#12
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Например, для варианта insunitsdefsource<>4
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 31.08.2012, 07:14
#13
Jonas

конструктор машиностроитель
 
Регистрация: 14.05.2007
Новосибирск
Сообщений: 893


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Например, для варианта insunitsdefsource<>4
Так в миллиметрах и работаю.
Jonas вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Извлечение масштабного коэффициента

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Извлечение атрибутов одной кнопкой Trasher Программирование 8 24.01.2017 11:34
Необходимость коэффициента постели С2 при расчете фундамента Peter987 Лира / Лира-САПР 3 20.02.2016 11:36
зависимость коэффициента теплопередачи от коэффициента теплопроводности Dimas_84_07 Поиск литературы, чертежей, моделей и прочих материалов 1 06.10.2010 13:36
определение аэродинамического коэффициента Иван 80 Конструкции зданий и сооружений 2 04.04.2008 11:06