|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
AutoCAD и delphi 7, добавление шаблонов
1с программист
Тамбов
Регистрация: 24.12.2011
Сообщений: 16
|
||
Просмотров: 10371
|
|
||||
Может пояснишь что за шаблоны ты добавляешь? Точнее что ты понимаешь под шаблоном (в терминах AutoCAD)?
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
*.dwt Если не программно, а самими средствами автокада, то можно шаблон в блок добавить указать масштаб и место куда вставлять, и вставляет, а вот программно нужно, а оказалось проблемой(((
procedure TForm1.Button1Click(Sender: TObject); var AutoCAD, Tab : OleVariant; ModelSpace, Acad : OleVariant; AcadPoint : OleVariant; BlockName: string; Block, BlkRef: OleVariant; begin BlockName:= 'New Block'; AcadPoint:=VarArrayCreate([0, 2], VT_R8); AcadPoint[0]:=1000; AcadPoint[1]:=1000; AcadPoint[2]:=0.0; try Acad:=GetActiveOleObject('AutoCAD.Application'); except Acad:= CreateOleObject('AutoCAD.Application'); end; Acad.visible:= True; ModelSpace := Acad.ActiveDocument.ModelSpace; //ModelSpace.AddShape('C:\1.dwg',StartPoint,0.01,0.0).Update; Block:= Acad.ActiveDocument.Blocks.Add(AcadPoint, BlockName); //Block.AddTable(AcadPoint,1,1,10,10); Block.AddShape('C:\1.dwt',AcadPoint,0.01,0.01).Update; end; Вот так делаю, и на строке Block.AddShape('C:\1.dwt',AcadPoint,0.01,0.01).Update; выдает ошибку про отсутствие записи в таблице и тут я впал в ступор Последний раз редактировалось zebra87, 24.12.2011 в 19:51. Причина: Добавление исходного кода |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Шаблон (dwt) не может быть "добавлен" в чертеж! Шаблон всего лишь прототип, по одному из которых создан чертеж.
В чертеж можно внедрять определения блоков (в том числе из файлов) и делать вставки экземпляров блоков. |
|||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
А как это можно реализовать? просто пробывал и dwg добавлять никак. Просто задание интересное, есть база данных в дельфях этих чертежей (шаблонов) каких либо схем, вот их нужно добавить на 1 чертеж, что бы получилась полноценная схема?
|
|||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
Подскажи как это реализовать, хотя бы какими методами, процедурами или функциями пользоваться
То что пользоваться блоками я понял, вот только проблема с добавление шаблона в блок, выдает ошибку, простые элементы в блок добавляет, а шаблоны не хочет. Последний раз редактировалось zebra87, 24.12.2011 в 21:37. |
|||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
Вот смотри, есть БД каких то приборов (например вольтметр или амперметр), есть его чертеж. Для построения электрической цепи, требуется несколько элементов, пользователь, делает выборку из БД этих приборов, размещает их на чертеже ну и в идеале делает трассировку между ними (т.е. соединение этих элементов кратчайшими путями), вот проблема стоит только в том, есть несколько приборов, а добавить их на чертеж не могу((( а приборы могут быть сложные по составу, поэтому разбиение его на простейшие элементы только геморой искать((( вот хотел их добавлять на 1 лист чертежа, а они гадюки не добавляются((( гугл весь перерыл, и русские и англоязычные сайты, нигде подобной инфы нет
На 3 сайтах программистов создавал данную тему, ни на одном на 2-х вообще ничего не ответили, а на 1 посоветовали здесь поискать решение данной проблемы Последний раз редактировалось zebra87, 24.12.2011 в 23:20. |
|||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,107
|
Ну блок в виде текста выглядит примерно так:
((-1 . <Имя объекта: -4d9288>) (0 . "BLOCK") (330 . <Имя объекта: -4d9290>) (5 . "1CD2F") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockBegin") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Имя объекта: -4d9278>) (2 . "bl1") (1 . "")) И далее следуют примитивы из которых он состоит Из подобного "текста" можно создать блок используя SendCommand и lisp, и довольно быстро, по сравнению с другими вариантами |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Забудь навсегда слово "шаблон"! Используй блоки. Блок может быть отдельным DWG-файлом. В БД храни только пути к ним, разумеется относительные. Ни в какие "тексты" не надо сохранять. DWG может обычный пользователь создавать, какие надо и как надо.
Как работать с блоками (и любыми другими объектами) изучай в acadauto.chm. Там вся объектная модель, с примерами на VB на все случаи. Однако ты идешь принципиально неверным путем. Ты делаешь свое приложение на Delphi, из которого пытаешься управлять Автокадом через объекты. Это примерно как дистанционно управлять марсоходом с Земли. Вроде и можно, но проблем будет несметное количество. Ты пока столкнулся с самой простой. Не столкнулся еще и с тем, что может быть не 'AutoCAD.Application'. Даже вставить блок в чертеж "дистанционно" не так просто. Надо точку вставки, поворот, масштаб (ы) задавать, могут быть атрибуты разных типов. Правильный путь (особенно с блоками): 1. Основное приложение, с которым работает юзер, написано на LISP и работает внутри AutoCAD. Это "водитель внутри марсохода". 2. То, что надо сделать на Delphi (например "вижуальная" работа с БД и выбор из нее) делаешь в Delphi в виде COM-сервера. 3. Пользователь, щелчком по кнопке или меню в Автокаде запускает программу. Он и не знает, на чем она написана, но это Lisp. 4. Lisp вызывает твой COM-сервер и юзер видит какой-то диалог, в котором выбирает блок. Или еще что. Это еще надо продумать и реализовать - как именно выбрать нужный блок из сотен или тысяч. 5. В основную программу сервер возвращает имя блока (файла). Далее множеством давно известных способов результат обрабатывается. Например, в нужное место в нужном масштабе вставляется изображение. Подробно все описано в книге "САПР на базе AutoCAD - как это делается". Как раз на примерах Delphi 7. А есть еще .NET и ObjectARX - там возможностей побольше будет. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
p.s. По тактике прдложенной автору с БД и блоками - я двумя руками за (хотя может быть вариант когда хранить описание блоков более рационально в двоичном виде прямо в базе - естественно с возможностью изменения их "разрешенным" пользователям).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
А почему бы не пользоваться готовыми методами Application? Вот единственный косяк, как с ними работать. С автокадом до этого ни разу не сталкивался, работал с Execl и wordом через COM а вот с автокадом столкнулся с трудностями. Еще читал про контейнеры, можно ли им разрешить мою проблему, единственное как пишут что он с автокадом тоже коряво работает( короче я в замешательстве
|
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
А вот с именем 'AutoCAD.Application' проблемы бывают. Может быть не один Автокад, в 'AutoCAD.Application' может числиться не тот, на который рассчитываем. Тут Autodesk порядочно мути внесла, с подменой "текущего" Application. "Другие ситемы" (ObjectARX, .NET) конечно работают, ведь они родные. Но и вызов-то их в итоге из LISP осуществляется. На все случаи не наделаешь "именованных" команд. А вот функции с аргументами, сделанные для Lisp - очень хорошо. Однако автор ветки про Delphi спрашивает, а там только COM будет доступен. Причем в самом ненадежном виде. Даже нет гарантии, что в библиотеках типов бродяги-программисты все правильно объявили. Цитата:
Например, нельзя "вычислить" с помощью VBA какой-то текст, а потом запросить точку для его вставки. Будет без спросу написан в текущей позиции курсора. А в AutoCAD это постоянно надо, предусмотрено. Цитата:
Можешь сам убедиться - откомпилируй Delphi7\Demos\ActiveX\OleCtnrs\ и попробуй туда в контейнер встроить Автокад в run-time. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
Цитата:
Вот это правда абсолютная, но скорее говорящея о выборе не самого хорошего инструмета (для автокада), хотя впрочем это частый случай - "пишу на том, что знаю", но если Вы советуете "до кучи" изучить лисп, да до уровня чтоб на нем писать "Основное приложение", то тем самым роль Delphi в данном случае - весьма вторична.
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 25.12.2011 в 19:18. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Если честно не понятно по какой области Вам нужна литература - для конкретно этой задачи - много не надо, в общем про программирование для автокада литературы масса, в том числе и здесь упомянутая.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Добавлю к вышесказанному, что метод AddShape не для добавления "шаблона" (чего в принципе не существует), а для добавления "формы". А это совершенно разные вещи...
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
Это тоже самое, что разбивать базу данных на ячейки...
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
![]() Цитата:
![]() Если моё предположение верно, то автору нужно в цикле извлечь все идентификаторы и по ним получить объекты (эта задача не сложная).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 26.12.2011 в 15:23. |
||||
![]() |
|
||||
Здесь смотри строки кода 86-92. С помощью этого кода получаешь идентификаторы всех объектов базы данных чертежа. Реализацию метода IsValid берёшь отсюда (из класса DbBrowser).
Имея на руках идентификаторы - свободно получаешь объекты. Код не сложный, думаю сообразишь, как переложить на лыжи делфей.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
hwd
Ему через COM нужно. zebra87 Смотри объектную модель AutoCAD. Объекты бывают двух типов: 1. Объекты (слои, типы линий, описание блоков, словари и т.д. - не графические) 2. Примитивы (графические объекты) - отрезки, полилинии, вставки блоков и т.д.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
Александр, я кстати воспользововался вашей программой по преобразованию dwg в bmp, а уже картинку вставлял, вставляет, но масштаб какой то маленький, реальный размер где то 1000:1, единственное что у меня получилось((( а как можно COM сервер настроить?
Вот только что получилось AttachExternalReference, добавил ссылку на шаблон, он появляется на чертеже. Вот только косяк в одном, он выдает ошибку если zScale = 0.0, а если координата z <> 0 то выводит, но в трехмерном пространстве Последний раз редактировалось zebra87, 26.12.2011 в 20:54. |
|||
![]() |
|
||||
Цитата:
Какой COM-сервер? Нормально, если zScale = 1.0. Но вообще-то это тоже не то. А главное, судя по всему, нет понимания ЧТО именно нужно. Тогда появится и понимание того, КАК это можно сделать.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
Ну а все же, как можно добавлять несколько шаблонов на 1 чертеж? Например имея 2 шаблона (1 - Квадрат, 2 - Треугольник) добавив их на чертеж получить грубо говоря домик. Если не сложно по подробнее, а то эта тема не дает покоя((((
|
|||
![]() |
|
||||
Регистрация: 21.02.2009
Сообщений: 825
|
Цитата:
Цитата:
Define a block and insert the block into a drawing This example defines a block and adds a circle to the block definition. It then inserts the block into the drawing as a block reference. Код:
P.S. "Шаблон" в автокаде это не то что ты подразумеваешь. Смотри объектную модель и вообще прочитай про Автокад
__________________
Я-проектировщик бывший проектировщик! |
|||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
Про блоки я тоже много примеров видел и читал про них, но как в этом примере который Вы привели, здесь добавление примитива и добавление его на чертеж. Если не программно, а как пользователь, то в блоках можно добавить путь к чертежу (файлу) и этот чертеж (файл) с его содержимым добавляется на рабочую поверхность, а вот программно видел только как добавлять примитивы. А так с блоками работать одно удовольствие. И если не сложно, можно название файла help-ы, а то я в этом совсем профан, только обучаюсь работе с автокадом(
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
zebra87, ты не путаешь шаблоны и блоки?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
1с программист Регистрация: 24.12.2011
Тамбов
Сообщений: 16
![]() |
Вот смотрите, у блока есть такая вещь, как "путь", указываешь путь к *.dwg файлу, задаешь масштаб и место вставки и он добавляет содержимое файла на чертеж в заданном масштабе и точке. Вот мне нужно что то типо такого, но косяк весь произошел в том, что у блока есть куча методов по добавлению в него примитивов и их рисование, а вот такой функции я не нашел((( нашел только как добавить ссылку и добавил ее, но Александр Ривилис в сообщении №29 сказал что это не то и он прав.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Понятно, полная путаница... Можно вставить блок, в том числе и из другого файла (точнее, вставленный блок будет полностью дублировать состав ModelSpace "другого файла"). Так что смотри на вставку блока:
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 21.02.2009
Сообщений: 825
|
Цитата:
Цитата:
__________________
Я-проектировщик бывший проектировщик! |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Какой AutoCAD использовать ? | denes | AutoCAD | 55 | 12.09.2011 14:29 |
Рабочие пространства в AutoCAD (Добавление, удаление, переименование) | nav3000 | AutoCAD | 1 | 23.08.2010 11:47 |
autocad и delphi программирование 3d модели | Korso | Программирование | 6 | 19.04.2010 11:00 |
Создание параметрического чертежа с помощью AutoCad и Delphi | karakatica | Программирование | 3 | 10.07.2009 13:01 |