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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Увеличение всех отметок на определенную величину

Увеличение всех отметок на определенную величину

Ответ
Поиск в этой теме
Непрочитано 22.11.2007, 11:47 #1
Увеличение всех отметок на определенную величину
Drweb
 
Регистрация: 22.11.2007
Сообщений: 10

Парни, довольно срочно нужно изменить все отметки съемки на одну и ту же величину (отметки просто в виде текста), есть ли уже готовое решение?
Просмотров: 42617
 
Непрочитано 22.11.2007, 11:49
#2
Кулик Алексей aka kpblc
Moderator

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


Пока не будет образца, решения будут "не те". Отметка - это что? Блок с атрибутом? Просто атрибут? Однострочный текст? Многострочный текст? Поле? Еще-какая-то-фигня?
---
Добавлено: в этом "неизвестно что" отметка с префиксами / суффиксами? Без? С какой точностью после запятой надо добавлять?
Блин, когда научатся вопросы задавать...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.11.2007, 11:50
#3
Drweb


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


Отметки - это однострочный текст
Drweb вне форума  
 
Непрочитано 22.11.2007, 11:52
#4
Кулик Алексей aka kpblc
Moderator

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


Прочти что "добавлено" у меня в посте.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.11.2007, 11:53
#5
Drweb


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


То есть я себе представляю это так - я выделяю весь текст, который нужно изменить, программуля меня спрашивает величину прироста - и я не теряю 1.5 дня на тупое механическое перебивание 1.5 тысяч отметок =)

Отметка выглядит, к примеру как "15.32". Точность до второго знака.
ЗЫ: Что за преффиксы и суффиксы? =)
Drweb вне форума  
 
Непрочитано 22.11.2007, 12:15
#6
Кулик Алексей aka kpblc
Moderator

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


Отметка как "Отм.+16.656". "Отм." - префикс.
Код:
[Выделить все]
(defun c:plus (/ *error* adoc value str)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if
    (and
      (setq selset (ssget "_:L" '((0 . "TEXT"))))
      (member
        (type (setq
                value (vl-catch-all-apply
                        '(lambda () (getdist "\nСколько добавлять <Отмена> : "))
                        ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
              ) ;_ end of type
        (list 'int 'real)
        ) ;_ end of member
      ) ;_ end of and
     (foreach ent (mapcar
                    'vlax-ename->vla-object
                    (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                    ) ;_ end of mapcar
       (if (equal (rtos (setq str (atof (vla-get-textstring ent))))
                  (vla-get-textstring ent)
                  ) ;_ end of equal
         (vla-put-textstring ent (rtos (+ str value) 2 2))
         ) ;_ end of if
       ) ;_ end of foreach
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Код не будет обрабатывать строки вида "16,65" (с запятой в качестве разделителя); "а123" (нечисловые). Ну, короче, "коленочный код".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.11.2007, 13:01
#7
Drweb


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


Спасибо за помощь. Но ничего не происходит! Просит выбрать объекты - выбираю несколько текстовых строк. Допустим, нужно увеличить отметку на 0.08 (8 сантиметров) - ввожу 0.08, Enter - ничего. Текст не меняется. В чем баг?

Блин, то есть мне нужно получить из текста ЧИСЛО, прибавить к нему другое число и засунуть назад в текст. =)
Drweb вне форума  
 
Непрочитано 22.11.2007, 13:13
#8
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


> Drweb
Что-б не гадать, просто выложи файл-образец небольшого размера. Код рабочий.
Alaspher вне форума  
 
Автор темы   Непрочитано 22.11.2007, 13:15
#9
Drweb


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


Хм. А что в образце мне показать? 2 числа? И какие они будут после прибавления к ним определенной величины? =)
Drweb вне форума  
 
Непрочитано 22.11.2007, 13:23
#10
Кулик Алексей aka kpblc
Moderator

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


Образец "до" и "после" выполнения команды plus с заданием величины смещения = 6.65
Код немного модифицировал для корректной обработки отрицательных значений:
Код:
[Выделить все]
(defun c:plus (/ *error* adoc value str)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if
    (and
      (setq selset (ssget "_:L" '((0 . "TEXT"))))
      (member
        (type (setq
                value (vl-catch-all-apply
                        '(lambda () (getreal "\nСколько добавлять <Отмена> : "))
                        ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
              ) ;_ end of type
        (list 'int 'real)
        ) ;_ end of member
      ) ;_ end of and
     (foreach ent (mapcar
                    'vlax-ename->vla-object
                    (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                    ) ;_ end of mapcar
       (if (equal (rtos (setq str (atof (vla-get-textstring ent))))
                  (vla-get-textstring ent)
                  ) ;_ end of equal
         (vla-put-textstring ent (rtos (+ str value) 2 2))
         ) ;_ end of if
       ) ;_ end of foreach
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Вложения
Тип файла: dwg
DWG 2004
before.dwg (27.3 Кб, 2974 просмотров)
Тип файла: dwg
DWG 2004
after.dwg (29.6 Кб, 2949 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.11.2007, 15:21
#11
Drweb


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


Спасибо, друг! Все работает =)
Drweb вне форума  
 
Автор темы   Непрочитано 24.11.2007, 18:49
#12
Drweb


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


Нашел такие баги - при получении в итоге ровной суммы (к примеру 16.00) получаем в результате просто "16". А результат необходим именно как "16.00". Отбрасывание нулей не нужно! Приходится забивать ручками ".00". И еще - не производятся никакие операции с числами, у которых на конце 0. То есть имеем отметку 13.10 - она видимо не переводится в число, не знаю почему. Поможете, господа хорошие?
Drweb вне форума  
 
Непрочитано 24.11.2007, 23:49
#13
Кулик Алексей aka kpblc
Moderator

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


Тогда так.
Код:
[Выделить все]
(defun c:plus (/ *error* adoc value str)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if
    (and
      (setq selset (ssget "_:L" '((0 . "TEXT"))))
      (member
        (type (setq
                value (vl-catch-all-apply
                        '(lambda () (getreal "\nСколько добавлять <Отмена> : "))
                        ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
              ) ;_ end of type
        (list 'int 'real)
        ) ;_ end of member
      ) ;_ end of and
     (foreach ent (mapcar
                    'vlax-ename->vla-object
                    (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                    ) ;_ end of mapcar
       (if (equal (rtos (setq str (atof (vla-get-textstring ent))))
                  (vl-string-right-trim ".0" (vla-get-textstring ent))
                  ) ;_ end of equal
         (vla-put-textstring
           ent
           ((lambda (/ a)
              (setq a (+ str value))
              (cond
                ((not (vl-string-search "." (rtos a)))
                 (strcat (rtos a 2 2) ".00")
                 )
                ((= (strlen
                      (substr (rtos a 2 2) (+ 2 (vl-string-search "." (rtos a))))
                      ) ;_ end of strlen
                    1
                    ) ;_ end of =
                 (strcat (rtos a 2 2) "0")
                 )
                (t (rtos a 2 2))
                ) ;_ end of cond
              ) ;_ end of lambda
            )
           ) ;_ end of vla-put-textstring
         ) ;_ end of if
       ) ;_ end of foreach
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Особо не тестировал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2008, 17:17
#14
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Кулик Алексей aka kpblc, протестировал твой последний код. Вот что я обнаружил:
1) Число вида ХХХ.ХХ (Х- любая цифра, кроме нуля) считается только если точность выставлена на "0.00" (формат->единицы), при этом числа вида ХХХ.Х0 и ХХХ.00 игнорируются лиспом;
2) При установке точности на "0.0" считаются только числа ХХХ.Х0;
3) А если поставить точность на "0" считаются числа ХХХ.00, (что вполне закономерно), но ответ выдается в виде ХХХ.00.00
Очень полезный лисп, жаль, что так ошибается....Можешь подправить?
skkkk вне форума  
 
Непрочитано 30.04.2008, 09:02
#15
Кулик Алексей aka kpblc
Moderator

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


Какая точность имеется в виду? luprec? Если есть возможность - пример с указанием версии AutoCAD'a (чтоб мне тут не гадать)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.04.2008, 10:39
#16
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Точность, которая выставляется через меню Формат>Единицы(Units). АКАД 2008 русский. Конкретный пример: надо числа 177.26; 177.10; 177.00 увеличить на 10. Ввожу "_PLUS", на приглашение ком. строки выбираю эти три текста, ENTER, "сколько добавлять" пишу 10, и изменяется только один из них, тот, в котором целых цифр(не нулей) после запятой столько, на сколько установлена точность. Т.е. если установлена "0.00", то посчитается только 177.26, если "0.0", то только 177.10
skkkk вне форума  
 
Непрочитано 01.05.2008, 16:49
#17
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Решил проверить предыдущий код с поста #10 - все работает как ни странно... Обрабатывает все числа (ХХХ.ХХ; ХХХ.Х0; ХХХ.00) И в результате в случае нулей пишет "ХХХ.00" или "ХХХ.Х0"
Drweb, может, тебе поможет выставление точности на "0.00" в меню Формат->Единицы (Format->Units). Так что пользуемся и выпускаем во Вселенную позитив, адресованный kpblc'у, пусть поикает
skkkk вне форума  
 
Непрочитано 21.05.2008, 05:35
#18
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Подскажите пожалуйста, что надо добавить в лисп, чтоб увеличенные лиспом тексты меняли цвет при изменении значения.... Ну чтоб определять, какие из текстов уже обработаны, а какие - нет. По совету VVA с пробовал вставить в лисп
Код:
[Выделить все]
(vla-put-Color vlaObj 3)  ;3-номер цвета
...Добился только одного из двух результатов: либо считает прирост отметок, либо меняет цвет, к обоим прийти не вышло
skkkk вне форума  
 
Непрочитано 21.05.2008, 09:38
#19
VVA

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


Покажи используемый код или дай ссылку
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.05.2008, 12:35
#20
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


VVA, код c #10
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Увеличение всех отметок на определенную величину

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск