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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вставка в пронумерованные объекты

Вставка в пронумерованные объекты

Ответ
Поиск в этой теме
Непрочитано 21.10.2010, 16:06
Вставка в пронумерованные объекты
junio77
 
Регистрация: 10.06.2010
Сообщений: 5

Здравствуйте уважаемые программисты! Помогите пожалуйста с проблемой... В общем есть план, в котором есть "туча" объектов типа текст (содержание которых - номер типа XX.XX.XX, но бывают разные.)
Они расставлены на плане по разному, (по кругу, кучками по секторам или покомнатно... в общем так, как удобно проектировщику).

Задача: добавить (или убрать) такой же объект, но чтобы его номер ВКЛИНИЛСЯ в общую нумерацию, то есть все последующие номера должны сдвинуться АВТОМАТИЧЕСКИ

чтобы наглядно было - привожу пример того, что должно получиться
есть должно быть
НВ.01.01 НВ.01.01
НВ.01.02 НВ.01.02
НВ.01.03 НВ.01.03
НВ.01.04 НВ.01.04
<- НВ.01.05
НВ.01.05 НВ.01.06
НВ.01.06 НВ.01.07
НВ.01.07 НВ.01.08
...... .....
НВ.01.100 НВ.01.101 (допустим...)

Та же самая проблема перенумеровки блоков с атрибутами (у более продвинутых проектировщиков )

Вручную переименовывать все объекты ОЧЕНЬ не хочется, да и времени мало. Может быть можно вносить данные из файла (*.xls или *.txt), это тоже можно как вариант рассмотреть.

Посоветуйте что-нибудь, пожалуйста!!!
Просмотров: 9478
 
Непрочитано 21.10.2010, 18:08
#21
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Без них бы пока разобраться
А вот это - неправильный подход. Рекомендую. Прочитай за вечер первую главу (она всего 35 страниц) - поймёшь, что сильно ошибаешься. Настоятельно рекомендую.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 21.10.2010, 19:13
#22
VVA

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Лиспер, к стыду своему, я про такое не знал. Собственно эти команды делают часть того, что я в #5 описал, только не с текстами а с атрибутами. Инструмент хорош, но его надо дополнять. Не вручную же текстовый файлик править, прописывая хендлы, имена блоков и значения атрибутов.
За наводку спасибо! Получается, что хендл объекта - такой же постоянный идентификатор объекта, как и ID?
Почитай еще как использует эти команды Дмитрий Тищенко (Maestro)
Первая статья Solo Autocad
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.10.2010, 21:47
#23
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от junio77 Посмотреть сообщение
Здравствуйте уважаемые программисты! Помогите пожалуйста с проблемой... В общем есть план, в котором есть "туча" объектов типа текст (содержание которых - номер типа XX.XX.XX, но бывают разные.)
Они расставлены на плане по разному, (по кругу, кучками по секторам или покомнатно... в общем так, как удобно проектировщику).

Задача: добавить (или убрать) такой же объект, но чтобы его номер ВКЛИНИЛСЯ в общую нумерацию, то есть все последующие номера должны сдвинуться АВТОМАТИЧЕСКИ

чтобы наглядно было - привожу пример того, что должно получиться
есть должно быть
НВ.01.01 НВ.01.01
НВ.01.02 НВ.01.02
НВ.01.03 НВ.01.03
НВ.01.04 НВ.01.04
<- НВ.01.05
НВ.01.05 НВ.01.06
НВ.01.06 НВ.01.07
НВ.01.07 НВ.01.08
...... .....
НВ.01.100 НВ.01.101 (допустим...)

Та же самая проблема перенумеровки блоков с атрибутами (у более продвинутых проектировщиков )

Вручную переименовывать все объекты ОЧЕНЬ не хочется, да и времени мало. Может быть можно вносить данные из файла (*.xls или *.txt), это тоже можно как вариант рассмотреть.

Посоветуйте что-нибудь, пожалуйста!!!
Попробуй такой лисп (совсем не тестировал - могут быть баги

Код:
[Выделить все]
;; renumb.lsp
;; by fixo () 2010 * all rights released
(vl-load-com)

(defun dxf (key alist)
  (cdr (assoc key alist))
  )


(defun increment  (txt pfx int / check num tail zeroes)
  (setq	num   (vl-string-subst "" pfx txt))

  (setq zeroes (vl-string-subst "" (itoa int) num))
  (if (<= int 8)
    (setq tail (strcat "0" (itoa (1+ int))))
    (setq tail (itoa (1+ int)))
    )
  (strcat pfx tail)
  )



(defun C:RENUMB (/ *error* check cnt data dym dyp elist en exmp filter mins num pfx se ss tmp)

  (defun *error*  (msg)			  ; create standard error handler
      (cond ((not msg))				  ; normal exit, no error
	    ((member msg '("Function cancelled" "quit / exit abort"))) ; escape
	    ((princ (strcat "\nError: " msg))	  ; display fatal error
	     (cond (*debug* (vl-bt)))))		  ; if in debug mode, dump backtrace

      (setvar 'cmdecho 1)                        ; restore environments

      (if dym (setvar 'dynmode dym))
      (if dyp (setvar 'dynprompt dyp))
 
      (command "._undo" "_end")
      
      )

  (command "._undo" "_begin")
	   
  (setvar 'cmdecho 0)
  
  (setq dym (getvar 'dynmode))
  (setvar 'dynmode 3)
   (setq dyp (getvar 'dynprompt))
   (setvar 'dynprompt 1)

   (setvar 'osmode 0)
   
;;;  (setq data nil);<-- debug only
  (prompt "\n\t\t>> Выбрать единичный текст-образец >>")
  (setq se (ssget "+.:S:E:L"));<-- select pattern
  (setq exmp (ssname se 0))
  (setq elist (entget exmp))
  (setq layer (dxf 8 elist))
  (setq filter (vl-remove-if-not (function (lambda(x)(member (car x) (list 0 410 8 40 7 1))))elist ))
  (setq pfx (getstring "\nВведите префикс (-> следи за раскладкой <-) <НВ.01.> : "))
  (if (eq "" pfx)(setq pfx "НВ.01."))
  (setq filter (subst (cons 1 (strcat "*" pfx "*"))(assoc 1 filter) filter))
  
  (setq ss (ssget "_X" filter))

  
  (while (setq en (ssname ss 0))
    (setq elist (entget en))
    (setq tmp (cons (dxf 5 elist)(dxf 1 elist)))
    (setq data (cons tmp data))
    (ssdel en ss)
    )
  
  (setq data
  (mapcar (function (lambda (i)
		      (nth i data)
		      )
		    )
  (vl-sort-i data
    (function (lambda(a b)
		(< (cdr a)(cdr b))
		)
	      )
    )
	  )
  )


  (setq mins (cdr (car data)))
  (setq num (vl-string-subst "" pfx mins)
	check num
	cnt (atoi num)
	)
  
  (setq data (cdr data))
  
  (while (setq tmp (cadr data))
    (setq en (handent (car tmp))
	  elist (entget en))
    (entmod (subst (cons 1 (increment (dxf 1 elist) pfx cnt))(assoc 1 elist) elist))
    (entupd en)
    (setq cnt (1+ cnt))
    (setq data (cdr data))
	  )
  (*error* nil)
(princ)
  )
    
(prompt "\n\t\t>> В командной строке ввести RENUMB >>")
(prin1)
Олег (jr.) вне форума  
 
Непрочитано 21.10.2010, 22:16
#24
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Вот, пример того, как можно получить идентификаторы объектов, содержащих текст, соответствующий указанному нами регулярному выражению (маске - если кому-то так понятней).

Код:
[Выделить все]
        [CommandMethod(ns, "cmd", CommandFlags.Modal)]
        public void Cmd()
        {
            using (Transaction t = db.TransactionManager.StartTransaction()) {

                //Выбираем идентификаторы всех DbText и Mtext (поскольку ссылки атрибутов наследуются от DbText - они тоже попадают под раздачу)
                //В примере использую регулярное выражение: "[а-яА-Я]{2}.[0-9]{2}.[0-9]{2}"
                //Означает оно следующее: строка должна содержать в любом своём месте фрагмент, начинающийся с двух русских букв, за которыми 
                //следует точка, за которой идут две цифры, потом опять точка и опять две цифры
                ObjectId[] primitives = GetPrimitives("[а-яА-Я]{2}.[0-9]{2}.[0-9]{2}");                
            }
        }
        /// <summary>
        /// Получить идентификаторы тех примитивов, которые содержат текст, удовлетворяющий условию, переданному в качестве параметра
        /// </summary>
        /// <param name="regexFilter">Регулярное выражение, на основании которого производится фильтрация нужного контента</param>
        /// <returns>Возвращается коллекция идентификаторов объектов, соответствующих указанному условию</returns>
         public ObjectId[] GetPrimitives(string regexFilter)
         {
             List<Type> types = new List<Type>() { typeof(MText), typeof(DBText), typeof(AttributeReference)};
             List<ObjectId> primitives = new List<ObjectId>();
 
             using (Transaction t = dwg.TransactionManager.StartTransaction()) // 'dwg' is Document
             {
                 for (long i = db.BlockTableId.Handle.Value; i < db.Handseed.Value; i++)// 'db' is Database
                 {
                     ObjectId id = ObjectId.Null;
                     try
                     {
                         id = db.GetObjectId(false, new Handle(i), 0);
                     }
                     catch (System.Exception)
                     { continue; }

                     if (!id.IsErased && types.Contains(t.GetObject(id, OpenMode.ForRead).GetType())) 
                     {
                         DBObject x = t.GetObject(id, OpenMode.ForRead);
                         Regex regex = new Regex(regexFilter);
                         if (x is MText) {
                             MText mtext = (MText)x;                             
                             bool result = Regex.IsMatch(mtext.Contents, regexFilter, RegexOptions.IgnoreCase);
                             if (result) primitives.Add(id);
                         }
                         else if (x is DBText) {
                             DBText text = (DBText)x;
                             bool result = Regex.IsMatch(text.TextString, regexFilter, RegexOptions.IgnoreCase);
                             if (result) primitives.Add(id);                             
                         }                         
                     }
                 }
             }
             return primitives.ToArray(); 
         }
В результате анализируются все атрибуты вхождений блоков, однострочные и многострочные тексты в базе данных чертежа.

Это код на выборку. При желании можно добавить и замену (так же на основе регексов).
Методу GetPrimitives можно задавать любые правила фильтрации - при этом не придётся переписывать код.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 21.10.2010 в 22:22.
hwd вне форума  
 
Непрочитано 21.10.2010, 22:20
#25
Кулик Алексей aka kpblc
Moderator

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


Аналог attin/attout, но для текстов. Без особых проверок.
Соответственно 2 команды: textout и textin
Вложения
Тип файла: lsp textinout.LSP (8.0 Кб, 126 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2010, 22:26
#26
VVA

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


В общем то регулярные выражения присутствуют и в лиспе. Может быть не такие мощные как в С, но все же
Код:
[Выделить все]
(wcmatch "НВ.01.01" "[А-Я][А-Я].##.##")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.10.2010, 22:30
#27
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
не такие мощные
ну так в рамках указанной задачи этого бы вполне хватило (во всяком случае для выборки).

Здесь ряд хороших статей про регулярные выражения и их использование в повседневной жизни на примере использования PowerShell (современная альтернатива cmd.exe, более мощная и удобная).
Offtop: Это ежели найдутся любознательные.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 21.10.2010 в 23:04.
hwd вне форума  
 
Непрочитано 22.10.2010, 02:16
#28
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Клик по тексту должен добавить 1 ко всем текстам которые больше или равны данному. Вид текста АБВГД01234.
Вложения
Тип файла: lsp tx1+.lsp (2.2 Кб, 68 просмотров)
Victor вне форума  
 
Непрочитано 22.10.2010, 08:03
#29
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Victor Посмотреть сообщение
Клик по тексту должен добавить 1 ко всем текстам которые больше или равны данному. Вид текста АБВГД01234.
Весёлое будет занятие, учитывая что
Цитата:
Сообщение от junio77
план, в котором есть "туча" объектов
А если вид текста должен быть другим? Код будете переписывать? И так под каждый вариант?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 22.10.2010, 09:42 Спасибо!
#30
junio77


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


Доброго времени суток всем форумчанам!
Большое спасибо всем за отклики.. я не думала, что за 1 день будет СТОЛЬКО ответов!!! (хотя некоторые разговоры были междусобойными.. но это в принципе не важно)
Обязательно попробую все предложенные варианты и если совсем ничего не получиться придется конкретизировать проблему и делать конкретный заказ...
Я сама в лиспе не много тоже писала, поэтому если получится могу переделать некоторые части программ.
Заранее всем спасибо!
junio77 вне форума  
 
Непрочитано 22.10.2010, 15:57
#31
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Дык для себя делал. На caduser год назад вывесил.
Victor вне форума  
 
Непрочитано 23.10.2010, 11:46
#32
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от junio77 Посмотреть сообщение
хотя некоторые разговоры были междусобойными..
Странно, мне казалось, что я ясно указал верное направление решения...
Аке, здесь выкладываю готовое решение (любой поиск с любой заменой текстового контента), озвученное видео, демонстрирующее, как это работает, исходники и откомпилированная библиотека.

Offtop: п.с. Если уж и это будет непонятным - я умываю руки.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 24.10.2010, 01:13
1 | #33
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Андрей.
Барышня в первом своем посте представила пример, где необходимо вклинить определенный номер в общую кучу, так чтобы все номера, которые больше (ориентируясь по крайней правой группе цифр), увеличили свое значение на 1. Как пользуясь вашим плагином это осуществить? В нем как минимум отсутствует средство запроса у пользователя номера, от которого требуется вести пересчет.
Ну и обратная задача, когда удалено несколько номеров. Причем, не обязательно подряд идущих. Требуется пересчитать в сторону уменьшения часть оставшихся, чтобы заполнить образовавшуюся "дыру" (дыры).

p.s.
По поводу лиспа. Лично я считаю, что все, что можно написать на лиспе, надо писать на лиспе из соображений минимальных затрат на сопровождение (а то и вовсе их отсутствия). Поставленная задача, на мой взгляд, вполне лиспу по силам.

Для junio77 и всех, кому интересна данная тема.
Во вложении представлен архив, содержащий лисп-файл программы и txt-файл справки для прикладной функции recount, как раз предназначенной для решения широкого круга задач перенумерации. В этом же лисп-файле содержится функция командной строки NUMRECOUNT. Её цель - продемонстрировать использование прикладной функции пересчета на примере однострочных текстов. Воссоздайте в AutoCAD пример из стартового топика данной темы и попробуйте.
Должного тестирования, разумеется, не было, поэтому если возникают ошибки, сообщайте. Если вопросы -спрашивайте.
Вложения
Тип файла: rar NumRecount.rar (6.5 Кб, 110 просмотров)
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 24.10.2010 в 18:36.
Pastor вне форума  
 
Непрочитано 25.10.2010, 11:35
#34
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Проделанная работа впечатляет!
Как время будет, попробую проанализировать... На первый взгляд - работает хорошо!
Не совсем пока понятно, для чего указываются опции учета и неучета префиксов и суффиксов...
Функцию c:numrecount, конечно, нужно дополнять возможностью отмены, обработкой ошибок ввода. Без этого запускать ее на реальных рабочих чертежах опасаюсь
Если ничего критичного не обнаружится, можно будет доработать маленько и применять.
Do$ вне форума  
 
Непрочитано 25.10.2010, 12:11
#35
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Не совсем пока понятно, для чего указываются опции учета и неучета префиксов и суффиксов...
Я старался решить задачу в максимально общем виде.
Если на чертеже есть группа деталей д1, д2, ...д100, а ещё есть группа а1, а2, ... а32, то персчет в первой группе гарантированно не затронет вторую группу, если установлена опция учета префикса. И гарантированно затронет, если опция не установлена. То же самое и с суффиксом.

Функция C:NUMRECOUNT исключительно демонстрационная. Можно написать похожую для атрибутов блоков, мультивыносок и всего, из чего можно выделять (и изменять) текст. Важно, что при этом функцию recount не требуется переделывать. Это такая прикладная функция перенумерции широкого спектра действия.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 25.10.2010 в 12:22.
Pastor вне форума  
 
Непрочитано 13.12.2010, 20:31
#36
VVA

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


Цитата:
Сообщение от VVA Посмотреть сообщение
В общем то регулярные выражения присутствуют и в лиспе. Может быть не такие мощные как в С, но все же
Код:
[Выделить все]
(wcmatch "НВ.01.01" "[А-Я][А-Я].##.##")
Цитата:
Сообщение от hwd Посмотреть сообщение
Здесь ряд хороших статей про регулярные выражения и их использование в повседневной жизни на примере использования PowerShell (современная альтернатива cmd.exe, более мощная и удобная).
Offtop: Offtop: Это ежели найдутся любознательные.
Можно подключить и такие же мощные как в C: Пример отсюда
Код:
[Выделить все]
(defun LM:UnFormat ( str / _Replace regex ) (vl-load-com)
  ;;; © Lee Mac 2010
  ;;; http://lee-mac.com/unformatstring.html
  (defun _Replace ( new old str )
    (vlax-put-property regex 'pattern old) (vlax-invoke regex 'replace str new)
  )
  (setq regex (vlax-get-or-create-object "VBScript.RegExp"))  
  (mapcar
    (function
      (lambda ( x ) (vlax-put-property regex (car x) (cdr x)))
    )
    (list (cons 'global actrue) (cons 'ignorecase acfalse) (cons 'multiline actrue))
  )
  (setq str
    (_Replace "$1" "[\\\\]+({)|{"
      (_Replace "$1" "[\\\\]+(})|}"
        (_Replace "$1/$2" "\\\\S([^;]*)[/#]([^;]*);"
          (_Replace "$1" "\\\\(\\\\+[ACcFfHLlOoPpQTW])|\\\\[ACcFfHLlOoPpQTW][^\\\\;]*;|\\\\[ACcFfHLlOoPpQTW]"
            (_Replace " " "\\\\P|\\n|\\t" str)
          )
        )
      )
    )
  )
  (vlax-release-object regex)
  str
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.12.2010, 13:10
#37
JokerrSergh


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


Цитата:
Сообщение от Pastor Посмотреть сообщение
Можно написать похожую для атрибутов блоков
Я был бы очень признателен за создание именно такой функции.
__________________
Вагоны, они ведь умнее паровоза, потому что они его толкают... когда он тормозит
JokerrSergh вне форума  
 
Непрочитано 14.12.2010, 15:51
#38
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Как ни странно это прозвучит, но я в автокаде не работаю и не программирую уже года три. То, что здесь представлено - это скорее программирование около автокада. Я свой талант зарыл (и забыл где). И именно поэтому в качестве демонстрации использовал однострочные тексты, как самое простое и с детства знакомое.

Вам, возможно, помогут здешние корифеи автолиспа! При условии, что задача не очень громоздкая. Плюс, вам нужно максимально подробно сформулировать её и обязательно дать примеры ваших блоков с атрибутами.

p.s.
Есть еще готовое решение от gomer: http://dwg.ru/dnl/3716. Гляньте, вдруг это то, что вам нужно.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 14.12.2010 в 15:56.
Pastor вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вставка в пронумерованные объекты



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Разорвать объекты в точках пересечения. BreakObjects. VVA Готовые программы 110 25.02.2022 07:33
Как удобней копировать объекты VVN AutoCAD 15 20.10.2016 01:24
Как определить стоимость проектных работ, если не известна стоимость строительства? dextron3 Поиск литературы, чертежей, моделей и прочих материалов 37 27.08.2014 18:32
пропали объекты с разных слоёв chili-9 AutoCAD 14 19.11.2009 17:14
Невидимые объекты Vova AutoCAD 9 15.09.2004 17:24