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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нумерация и позиционирование (дубль 2)

Нумерация и позиционирование (дубль 2)

Ответ
Поиск в этой теме
Непрочитано 12.12.2007, 16:24
Нумерация и позиционирование (дубль 2)
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Мне на ум пришла одна мысль, как связать один элемент с другим в пару. Вот есть у меня динамический блок, а в нем атрибут с номером позиции и атрибут с номером элемента. Есть рядом с блоком значек с текстом внутри. Мне надо, чтобы текст в значке стал таким-же как и в атрибуте.

Я понимаю, что в блок можно вставить и значек с таким номером, и текст с формулой, но пока я о другом, это просто пример. Мне надо, чтобы значение свойства определенного элемента поменялось на определенное, другое значение. К примеру текст в элементе mtext в значке.

Ставим в блок атрибут. В атрибут вставляем формулу, которая указывает на выбранный объект и выбранное свойство в этом объекте. Далее, вставляем туда же еще одну формулу и указываем скажем другой атрибут и его значение. Макрос должен прочтя первое значение найти объект, который надо изменить и свойство, которое надо в нем отредактировать, прочтя второе, найти второй элемент, прочитать что у него записано в значении свойства и изменить свойство первого объекта на такое же.

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

Можно и текст менять в таблицах, при этом он не будет с формулой, а чистый пречистый.
Более доходчиво идея описана в посте #70

Последний раз редактировалось Supermax, 15.12.2007 в 12:51.
Просмотров: 12164
 
Автор темы   Непрочитано 14.12.2007, 11:32
#61
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я так понимаю, что AddToEname, LinkObj, PropName надо делать самому?
Supermax вне форума  
 
Автор темы   Непрочитано 14.12.2007, 11:38
#62
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Типа
(setq AddToEname (car (entsel "укажите MTEXT или ATTRIB или ATTDEF")))
(setq LinkObj (vlax-ename->vla-object (car (entsel))))
(setq PropName "length")

Так?

Последний раз редактировалось Supermax, 14.12.2007 в 11:52.
Supermax вне форума  
 
Автор темы   Непрочитано 14.12.2007, 11:42
#63
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не работает так. Чего-то не хватает.
Supermax вне форума  
 
Автор темы   Непрочитано 14.12.2007, 11:58
#64
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А это что? (vlax-get LinkObj PropName)

Нет такой функции у меня vlax-get . Может у него библиотека подгружена своя?
вот vlax-get-propery есть. Но все равно не работает.

Последний раз редактировалось Supermax, 14.12.2007 в 12:06.
Supermax вне форума  
 
Непрочитано 14.12.2007, 12:19
#65
Кулик Алексей aka kpblc
Moderator

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


vlax-get - недокументированный способ получения определенного свойства activex-представления объекта. Официально не поддерживается и дальнейшая его судьба неизвестна (по информации, полученной от Полещука Н.Н. еще с год назад, если не больше).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.12.2007, 12:26
#66
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


У меня в lspdump его нет.
Supermax вне форума  
 
Непрочитано 14.12.2007, 12:35
#67
VVA

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


(vlax-get LinkObj "Length") это тоже, что и (vla-get-length Linkobj)
У меня тоже не работает. Буду разбираться почему, но позже.
Там же выложил еще парочку набросков своих ф-ций и примеров их использования
DEMO1 - сносит все поля в тексте
DEMO2 - сносит поля AcVar (ссылающиеся на переменные)
DEMO3 втавляет поле с текущей датой в текст
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.12.2007, 13:31
#68
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вскрыл я мозг тексту. Четыре словаря, вложенных друг в друга
Код:
[Выделить все]
(2 . "$Kpblc (имя_функции Первое поле_%<\\_FldIdx 0>% второе поле_%<\\_FldIdx 1>% и_еще_что-нибудь)")
Короче, все нашел, что нужно для обработки.

В этом словаре далее идут указатели на словари первого поля и второго поля и в них уже указатели на объекты и заказнные в них свойства.

Для скорости
Цитата:
(setq ad1 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (car (entsel)))))))))))))
(entget (cdr (assoc 360 ad1)))

Последний раз редактировалось Supermax, 14.12.2007 в 13:42.
Supermax вне форума  
 
Автор темы   Непрочитано 15.12.2007, 10:12
#69
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Пересмотрел принцип передачи аргументов функции из mtext. Найдя mtext и выявив в нем имя функции, макрос запускает эту функцию и передает ей -1 код с именем самого mtext-a. Переменную, куда стартовый макрос записывает -1 код для этой функции надо именовать также как и саму функцию с префиксом, скажем, @. Стартовых макросов может быть много и разных производителей. Метки тоже естественно будут разные. А вот имя переменной должно быть не зависимым от производителя стартового макроса. Поэтому я и предлагаю ее называть точно также как и саму функцию, только с префиксом @.

Чтобы не было написано дальше в теле mtext-a значения не имеет. Если функция требует или принимает целые лисп выражения в теле аргументов к ней, так она и прочитает, то, что ей нужно, а если ей много не надо, то значит и наворотов по распознавани. вложенных в аргументы подфункций не будет.
Кому какие аргументы надо, тот и функцию пишет так, как хочет.

Короче, в стартовом макросе не будет процедуры анализа текста с целью поиска указателей на объекты, нахождения гороха в мешке с гречкой и т.п.
Нашли mtext по метке в начале строки, прочли имя функции, создали переменную с тем-же именем и сохранив в нее -1 код данного mtexta запустили функцию.
Supermax вне форума  
 
Автор темы   Непрочитано 15.12.2007, 12:36
#70
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


У меня такая радость, такая радость -заказчик приболел,

что я, даже пофлудю немного.

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

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

Если элементов очень много, вы обречены постоянно выделять те элементы, которые надо этим макросом обрабатывать, или надо под этот, конкретный чертеж писать свой макрос, либо все элементы этого чертежа загружать в базу, с которой будет работать макрос.
Задница, короче.

Как простому юзеру привязать нужный элемент к нужному макросу при этом, не потеряв своей юзерской девственности?

Вот так:

Создаете mtext, в котром в начале пишете $Kpblc или другое ключевое слово, по которому стартовый макрос найдет данный mtext, пробел, открываете скобку, имя макроса, и дальше то, что от вас попросит создатель макроса.
Это могут быть и просто цифровые или буквенные выражения и естественно поля. Какие поля с формулами или без вам тоже скажет создатель макроса.

Например, зайдя в библиотеку макросов вы видете, что некий чел написал макрос, который изменяет параметр дин. блока в зависимости от длинны выбранной вами линии. В хелпе к этому макросу написано, что его имя (в смысле, макроса) например Lendh->Distance и после имени макроса надо указать полем на линию, затем пробел, затем полем на нужный блок и выбрать в нем нужное свойство, которое должно быть дистанцией.

получится типа $Kpblc (Lendh->Distance 12345 91045)

Я специально выбрал цвет, чтобы было понятно, что это поля.

Вы помещаете этот mtext на край рабочего пространства, чтобы в чертеже не появился и дальше:

Стартовый макрос - это такая программка, которую скоро можно будет от сюда скачать, которая находит эти специальные mtext-ы и запускает из конкретной папки, где вы храните макросы тот макрос, который вы хотите использовать по отношению к выбранным вами элементам.

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

Если что не понятно - спрашивайте.

Последний раз редактировалось Supermax, 15.12.2007 в 16:11.
Supermax вне форума  
 
Непрочитано 18.12.2007, 20:00
#71
VVA

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


На досуге немного "напрограммировал". Очень сырой примерчик установки длины отрезка(ов). Источником длины служат дуга, отрезок или круг, ссылки на которые прописаны в поле.
На запрос "Укажи текст-источник примитива" выбираем любой красный текст, на запрос "Укажи текст-приемник свойства" синий текст. Синий и фиолетовый отрезок "равняются" по длинне объекта, на который ссылается поле текста-источника.
Код:
[Выделить все]
;;; Возвращает имя примитивов и свойств из полей текста
(defun _get-en-and-prop-from-field (txt / dict field field_data lst lst1)
  (and
    (setq dict (cdr (assoc 360 (entget txt)))) ;_Ename Dictionary Словарь примитива
    (setq dict
           (cdr (assoc 360 (member '(3 . "ACAD_FIELD") (entget dict))))
    ) ;_Enable Field Dictionary Есть поля в объекте
    (setq dict (cdr (assoc 360 (member '(3 . "TEXT") (entget dict))))) ;_ Field Record Запись поля
 ;_Sub Field Records Вторичные записи полей
    (setq field (mapcar 'cdr
                        (vl-remove-if
                          '(lambda (x) (/= (car x) 360))
                          (entget dict)
                        ) ;_ end of vl-remove-if
                ) ;_ end of mapcar
    ) ;_ end of setq
    (or (setq lst1 ;_прямые ссылки полей на примитивы
        (vl-remove-if-not '(lambda (x)(and (car x)(cdr x)))
                (mapcar '(lambda (field_data)
     (cons
                                  (mapcar 'cdr
                                         (vl-remove-if
                                           '(lambda (x) (/= (car x) 331))
                                           (entget field_data)
                                         ) ;_ end of vl-remove-if
                                  ) ;_ end of mapcar
      (cdr(assoc 1 (member '(6 . "ObjectPropertyName") (entget field_data))))
      )
                               ) ;_ end of lambda
                              field
                      ) ;_ end of mapcar
   )
               ) ;_ end of setq
        t
    ) ;_ end of or
    (if (setq ;_вложенные ссылки полей на примитивы (формулы в полях)
          lst (apply 'append
                     (mapcar '(lambda (field_data)
                                (mapcar 'cdr
                                        (vl-remove-if
                                          '(lambda (x) (/= (car x) 360))
                                          (entget field_data)
                                        ) ;_ end of vl-remove-if
                                ) ;_ end of mapcar
                              ) ;_ end of lambda
                             field
                     ) ;_ end of mapcar
              ) ;_ end of apply
        ) ;_ end of setq
      (setq lst 
                   (mapcar '(lambda (field_data)
         (cons
                              (mapcar 'cdr
                                      (vl-remove-if
                                        '(lambda (x) (/= (car x) 331))
                                        (entget field_data)
                                      ) ;_ end of vl-remove-if
                              ) ;_ end of mapcar
         (cdr(assoc 1 (member '(6 . "ObjectPropertyName") (entget field_data))))
    )
                            ) ;_ end of lambda
                           lst
                   ) ;_ end of mapcar
            
      ) ;_ end of setq
    ) ;_ end of if
  ) ;_ end of and
  (append lst lst1)
) ;_ end of defun

(defun C:TEST ()
  (if (and (setq text_from (car(entsel "\nУкажи текст-источник примитива: ")))
           (wcmatch (cdr(assoc 0 (entget text_from))) "*TEXT")
    (setq text_to (car(entsel "\nУкажи текст-приемник свойства: ")))
           (wcmatch (cdr(assoc 0 (entget text_to))) "*TEXT")
    (if
    (= (length (setq lst (_get-en-and-prop-from-field text_from))) 1)
    lst
    (progn
      (alert "В поле должен быть указан один примитив")
      nil
      )
    )
    (setq lst1 (mapcar 'caar (_get-en-and-prop-from-field text_to)))
           )
    (progn
      (setq en (caaar lst)
     prp (cdar lst)
     )
      (foreach en_to lst1
 (setq obj_to (vlax-ename->vla-object en_to))
 (if (vlax-write-enabled-p obj_to)
    (if (and (= (cdr(assoc 0 (entget en_to))) "LINE")
      (wcmatch (strcase prp) "*LENGTH,CIRCUMFERENCE")
      )
      (progn
        (setq p1 (cdr(assoc 10 (entget en_to)))
       p2 (cdr(assoc 11 (entget en_to)))
       len (vlax-get-property (vlax-ename->vla-object en) prp)
       )
      (vla-put-EndPoint obj_to (vlax-3d-point(polar p1 (angle p1 p2) len)))
            (vl-cmdf "_updatefield" text_to "")
        )
   )
 )
      )
    )
    )
  (princ)
  )
Вложения
Тип файла: dwg
DWG 2004
test.dwg (34.1 Кб, 563 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.12.2007, 21:18
#72
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Блин! Ну почему под конец дня? Когда мне надо бежать домой
Supermax вне форума  
 
Непрочитано 19.12.2007, 09:32
#73
VVA

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Блин! Ну почему под конец дня? Когда мне надо бежать домой
Так заказчики пока только у тебя болеют
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 19.12.2007, 11:44
#74
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну, во первых ты не молоток, ты отбойный молоток!
Наконец-то хоть один человек просек, о чем я базарю.
Только пару поправок:
Во-первых надо все поля писать в одном mtext-e. Именно этим они и связываются в группу. Первое поле - ведущее, остальные - ведомые. Ну да ладно, надо все по человечески сделать. Главное наглядный пример, что все пашет, уже есть.
Во-вторых - ты линии по длине только в 2D делаешь, а надо 3D. Но все равно, молодец, молодец, молодец!

Постоянное "укажи то", да "укажи се" не катит никак. Тексты должны опознаваться автоматически, а значит, в них должна быть какая-то метка. Вот в строке в 2-ом dxf коде есть такая метка - это сочетание _%<\\ для опознания, что дальше идет имя объекта поля, а >%, то, что дальше описания поля нет. У нас я предлагал такую метку сделать как $Kpblc это типа подарка ему на день рождения. Но как тщательнее подумал, понял, что меток надо много, поскольку не всегда удобно корректировать все сразу. Поэтому возник вопрос, а где их держать?
Вот ко мне пришел чужой чертеж, а там чужие метки. Сколько их и какие они я не знаю. По доллару в начале строки можно догадаться, что это метка. Может и два доллара надо ставить. А вот остальное надо по моему, хранить прямо в чертеже. Метки должны быть доступны к редактированию, дополнению и удалению.
Вопрос открытый и я до конца его не доковырял.

Второй вопрос - это последовательность запуска отдельных меченных mtext-ов. Предлагаю сразу за меткой ставить число, соответствующее очередности запуска данного связующего mtext-a. Оно не обязательно и его можно не ставить, если очередность не имет значения. типа $Kpblc 123 (имя функции .....
Если попались два одинаковых номера, то надо, либо останавливать работу, подсвечивать ручками оба mtext-а и выбрасывать сообщение, что они бракованные. Либо надо выбрать тот, кто был создан первый и запускать по приоритету старшинства. Кстати имя элемента несет в себе порядковый номер создания.
Вопрос также - открытый.

Третье - эти mtext-ы надо включать и выключать. В смысле видимости. Тогда их можно будет располагать рядом с элементами чертежа, что удобно для пользования.
Ну это чистой воды сервис.

Четыре - я передумал передавать функции -1 код текста. Надо взять строку типа:
Код:
[Выделить все]
"$Kpblc 123 (имя_функции %<\\_FldIdx 0>% %<\\_FldIdx 1>%)"
Стереть в начале строки до скобки $Kpblc 123 , затем в точном соответствии с содержимым указателя поля создать одноименные переменные FldIdx0 и FldIdx1 и прописать в них указатели на их словари. Стереть в строке все эти скобки и подчеркивания чтобы получилась вот такая строка:
Код:
[Выделить все]
"(имя_функции FldIdx0 FldIdx1)"
и ее запустить в лиспе.
Именно функция уже и будет разбираться с этим словарем. Формула там, или объект - без разницы.

Вот такой вот план.

Последний раз редактировалось Supermax, 19.12.2007 в 11:59.
Supermax вне форума  
 
Автор темы   Непрочитано 19.12.2007, 13:20
#75
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Добавлю:
Если взять простой текст и посмотреть на его свойства, то в них вы 360 пары не найдете. Но, как только вы перед текстом вставите %<\ а после >% с нажатием процентов весь текст превратится в поле, а в свойствах появится словарь.
Supermax вне форума  
 
Автор темы   Непрочитано 19.12.2007, 17:00
#76
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


С долларом облом приключился. в DIESEL фигурирует.

Не, доллар пока вроде не помеха.

Последний раз редактировалось Supermax, 19.12.2007 в 17:09.
Supermax вне форума  
 
Непрочитано 19.12.2007, 17:14
#77
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


ставь тогда ?!
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.12.2007, 18:02
#78
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да, недоработка, однако у евросоюза. На клавах бакс е, а евро нема! Ай, яй яй! Дык, а как его в клаву впихнуть?
Supermax вне форума  
 
Непрочитано 19.12.2007, 18:51
#79
VVA

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


1. Все пишестя в 1 (м)тексте
2. Пока в 2D
3. Пока команда XX_TEST, а не ф-ция
3. Нужные тексты помечаются расширенными данными (далее РД)
для выбора и дальнейшей обработки. Структура имени РД маска $DwgRu далее случайные уникальные числа. Команды для маркировки/демаркировки XX_Mark, XX_Del, XX_SEL присвоенное РД записывается в гиперссылку текста.
Команда XX_TEST проходится по маркированным текстам, берет из них поля, причем первое поле - ведущее (берется примитив и его свойство), остальные - ведомые (берутся имена примитивов и пытаемся установить им св-во ведущего примитива).
В прилагаемом примере после применения команда XX_TEST синий и зеленый отрезок уравняют длину с красным (источник - Текст1), и синий отрезок поменяет цвет на фиолетовый (источник Текст2)
Вложения
Тип файла: dwg
DWG 2004
test.dwg (43.0 Кб, 546 просмотров)
Тип файла: lsp supermax-field.LSP (16.4 Кб, 76 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 20.12.2007 в 10:41. Причина: Добавлена ф-ция mip-conv-to-str
VVA вне форума  
 
Автор темы   Непрочитано 19.12.2007, 19:25
#80
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


VVA, у меня ощущение, что я стал миллиардером, но сижу на раскаленной сковородке.
Почему ты не дискутируя по поводу метки, взял и ее впихнул в текст, да еще и в расширенные данные?
Теперь, чтобы понять, кто меченый, а кто нет, надо постоянно подсвечивать твоей командой тексты.

У меня задумка была "продлить" лисп. Сделать текст, или мтекст продолжением макроса, чтобы можно было писать лиспы сложной конфигурации, но чтобы в теле программы были поля. Для этого я и изголялся по поводу обработки строк с указателями на поля.
Какой бы ты текст не написал (тра-ля-ля ...поле1 полеN (тра-ля-ля ... полеn)) все сведется к нормальному выражению, которое можно будет слизав из текста запустить в работу.

Не губи перспективу!!! Умоляю!!!

А так, круто и весьма впечатляет. Еще больше впечатлит, если текст начнет изменять длину (а не наоборот, как раньше) Можно даже текст в конце предложения сделать ведущим, только точку в разделителе вместо запятой надо автоматом подставлять.

Сразу скажу, что если написать просто (функция - поля), то это для любого юзера понятно, но мне надо больше чем простым юзерам, да и многим тоже. От постановки задачи зависит все. Чуть в сторону и уже не тот результат. Юзеры будут использовать этот микроскоп как молоток, а мы как положено (как антураж великих умов).
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нумерация и позиционирование (дубль 2)

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сквозная нумерация чертежей Alxd Прочее. Архитектура и строительство 26 19.06.2024 09:01
Нумерация в МТекст Bull AutoCAD 36 01.12.2022 14:24
Нумерация листов в AutoCad Sergk AutoCAD 21 11.03.2022 05:21
Автоматическая нумерация текстов dorofei Программирование 8 18.01.2007 09:31
Нумерация страниц в файлах Димас AutoCAD 1 22.12.2005 10:31