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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCAD и delphi 7, добавление шаблонов

AutoCAD и delphi 7, добавление шаблонов

Ответ
Поиск в этой теме
Непрочитано 24.12.2011, 17:51 #1
AutoCAD и delphi 7, добавление шаблонов
zebra87
 
1с программист
 
Тамбов
Регистрация: 24.12.2011
Сообщений: 16

Всем доброго времени суток. Есть вопрос к профессионалам данного портала, мне нужно добавлять шаблоны в автокад, причем по несколько штук на чертеж. Примитивы чертить не проблема, а вот как пытаюсь добавить шаблон, сразу ошибка. Помогите пожалуйста, гугл мне не очень помог, везде только рисование примитивов, а про шаблоны ни слова.
Пробывал и добавлять шаблоны в блок Block.AddShape и на прямую, т.е. просто AddShape, ни в какую, выдает ошибки то OLE то типо не хватает каких то записей в какой то таблице((( я в этом профан, перечитал много литературы, но про шаблоны нигде ничего не сказано.
Просмотров: 10371
 
Непрочитано 24.12.2011, 19:31
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от zebra87 Посмотреть сообщение
а вот как пытаюсь добавить шаблон, сразу ошибка
Может пояснишь что за шаблоны ты добавляешь? Точнее что ты понимаешь под шаблоном (в терминах AutoCAD)?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 24.12.2011, 19:42
#3
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


*.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. Причина: Добавление исходного кода
zebra87 вне форума  
 
Непрочитано 24.12.2011, 20:07
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Шаблон (dwt) не может быть "добавлен" в чертеж! Шаблон всего лишь прототип, по одному из которых создан чертеж.
В чертеж можно внедрять определения блоков (в том числе из файлов) и делать вставки экземпляров блоков.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 24.12.2011, 20:52
#5
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


А как это можно реализовать? просто пробывал и dwg добавлять никак. Просто задание интересное, есть база данных в дельфях этих чертежей (шаблонов) каких либо схем, вот их нужно добавить на 1 чертеж, что бы получилась полноценная схема?
zebra87 вне форума  
 
Непрочитано 24.12.2011, 21:17
#6
trir


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


Так наверно надо шаблоны перевести в блоки или добавлять внешней ссылкой
trir вне форума  
 
Автор темы   Непрочитано 24.12.2011, 21:29
#7
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Подскажи как это реализовать, хотя бы какими методами, процедурами или функциями пользоваться

То что пользоваться блоками я понял, вот только проблема с добавление шаблона в блок, выдает ошибку, простые элементы в блок добавляет, а шаблоны не хочет.

Последний раз редактировалось zebra87, 24.12.2011 в 21:37.
zebra87 вне форума  
 
Непрочитано 24.12.2011, 22:42
#8
trir


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


Забудь про шаблоны, а лучше по подробней опиши задачу, лучше с примерами
trir вне форума  
 
Автор темы   Непрочитано 24.12.2011, 23:15
#9
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


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

На 3 сайтах программистов создавал данную тему, ни на одном на 2-х вообще ничего не ответили, а на 1 посоветовали здесь поискать решение данной проблемы

Последний раз редактировалось zebra87, 24.12.2011 в 23:20.
zebra87 вне форума  
 
Непрочитано 24.12.2011, 23:20
#10
trir


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


Чертёж загони в блок, блок получи как текст и сохрани в БД. Ну а потом вставляй как блок.
trir вне форума  
 
Автор темы   Непрочитано 24.12.2011, 23:25
#11
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Я просто думал создавать кучу шаблонов, а в БД хранить только пути к ним, и по выборке чертить его в автокаде, а как его в текст сохранить, dfx что ли?
zebra87 вне форума  
 
Непрочитано 25.12.2011, 00:22
#12
trir


 
Регистрация: 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, и довольно быстро, по сравнению с другими вариантами
trir вне форума  
 
Непрочитано 25.12.2011, 07:42
#13
ShaggyDoc

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 - там возможностей побольше будет.
ShaggyDoc вне форума  
 
Непрочитано 25.12.2011, 09:29
#14
Дима_

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Однако ты идешь принципиально...
1. Основное приложение, с которым работает юзер, написано на LISP и работает внутри AutoCAD. Это "водитель внутри марсохода".
2. То, что надо сделать на Delphi (например "вижуальная" работа с БД и выбор из нее) делаешь в Delphi в виде COM-сервера.
Чем обусловлен выбор только такой тактики - ИХМО она имеет право на жизь - но не более чем на равных правах с предложенной автором. Регистрация COM-servera не менее слобое звено чем "не 'AutoCAD.Application'" (просто другого характера). При всей моей любви к лиспу - без потери чего-либо, в автокаде, можно обойтись и без него - система достаточно хорошо интегрированна со всеми перечисленными Вами средствами и прекрасно работают без "водителей внутри марсохода".
p.s. По тактике прдложенной автору с БД и блоками - я двумя руками за (хотя может быть вариант когда хранить описание блоков более рационально в двоичном виде прямо в базе - естественно с возможностью изменения их "разрешенным" пользователям).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 25.12.2011, 11:32
#15
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


А почему бы не пользоваться готовыми методами Application? Вот единственный косяк, как с ними работать. С автокадом до этого ни разу не сталкивался, работал с Execl и wordом через COM а вот с автокадом столкнулся с трудностями. Еще читал про контейнеры, можно ли им разрешить мою проблему, единственное как пишут что он с автокадом тоже коряво работает( короче я в замешательстве
zebra87 вне форума  
 
Непрочитано 25.12.2011, 12:14
#16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Регистрация COM-servera не менее слобое звено
Да в чем слабость-то? Или инсталлятор зарегистрирует, или regsvr32 xxx.dll.
А вот с именем 'AutoCAD.Application' проблемы бывают. Может быть не один Автокад, в 'AutoCAD.Application' может числиться не тот, на который рассчитываем. Тут Autodesk порядочно мути внесла, с подменой "текущего" Application.

"Другие ситемы" (ObjectARX, .NET) конечно работают, ведь они родные. Но и вызов-то их в итоге из LISP осуществляется. На все случаи не наделаешь "именованных" команд. А вот функции с аргументами, сделанные для Lisp - очень хорошо.

Однако автор ветки про Delphi спрашивает, а там только COM будет доступен. Причем в самом ненадежном виде. Даже нет гарантии, что в библиотеках типов бродяги-программисты все правильно объявили.

Цитата:
С автокадом до этого ни разу не сталкивался, работал с Execl и wordом через COM а вот с автокадом столкнулся с трудностями
Вот в том и проблема, что не сталкивался. Офисные программы специально так и сделаны, чтобы легко интегрироваться. Да и их объекты и методы такие, что легко вписываются в идеологию COM. Однако и там проблем хватает.

Например, нельзя "вычислить" с помощью VBA какой-то текст, а потом запросить точку для его вставки. Будет без спросу написан в текущей позиции курсора. А в AutoCAD это постоянно надо, предусмотрено.

Цитата:
Еще читал про контейнеры, можно ли им разрешить мою проблему
Нет. В отличие от "офисных" и других "легких" приложений, AutoCAD система очень тяжелая в запуске. Он не позволит себя просто так встроить себя.
Можешь сам убедиться - откомпилируй Delphi7\Demos\ActiveX\OleCtnrs\ и попробуй туда в контейнер встроить Автокад в run-time.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 25.12.2011, 16:36
#17
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Подкинте пожалуйста литературы по этой теме, будем крутиться как сможем
zebra87 вне форума  
 
Непрочитано 25.12.2011, 19:05
#18
Дима_

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Да в чем слабость-то? Или инсталлятор зарегистрирует, или regsvr32 xxx.dll.
В пользователях "не администраторах", хотя проблема конечно решаемая, но она есть.
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
На все случаи не наделаешь "именованных" команд. А вот функции с аргументами...
с 2007 версии проблема решена.
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Однако автор ветки про Delphi спрашивает, а там только COM будет доступен. Причем в самом ненадежном виде.
Вот это правда абсолютная, но скорее говорящея о выборе не самого хорошего инструмета (для автокада), хотя впрочем это частый случай - "пишу на том, что знаю", но если Вы советуете "до кучи" изучить лисп, да до уровня чтоб на нем писать "Основное приложение", то тем самым роль Delphi в данном случае - весьма вторична.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 25.12.2011 в 19:18.
Дима_ вне форума  
 
Автор темы   Непрочитано 25.12.2011, 21:28
#19
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Ну а какими книгами пользоваться? С чего то ведь надо начинать. Да и всем спасибо) буду дальше сам тыркаться)
zebra87 вне форума  
 
Непрочитано 25.12.2011, 21:58
#20
Дима_

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


Если честно не понятно по какой области Вам нужна литература - для конкретно этой задачи - много не надо, в общем про программирование для автокада литературы масса, в том числе и здесь упомянутая.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 25.12.2011, 22:34
#21
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Добавлю к вышесказанному, что метод AddShape не для добавления "шаблона" (чего в принципе не существует), а для добавления "формы". А это совершенно разные вещи...
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 26.12.2011, 08:48
#22
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Ааа, ясно, а я голову ломал над этим методом( будем искать другой подход

А как мне имея файл *.dwt или*.dwg разбить его на составляющие примитивы (если это возможно)?
zebra87 вне форума  
 
Непрочитано 26.12.2011, 09:39
#23
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от zebra87 Посмотреть сообщение
А как мне имея файл *.dwt или*.dwg разбить его на составляющие примитивы (если это возможно)?
Это тоже самое, что разбивать базу данных на ячейки...
Александр Ривилис вне форума  
 
Непрочитано 26.12.2011, 15:14
#24
hwd

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это тоже самое, что разбивать базу данных на ячейки...

Цитата:
А как мне имея файл *.dwt или*.dwg разбить его на составляющие примитивы (если это возможно)?
может автор хочет в цикле пробежаться по всем объектам базы данных чертежа? Ну это я так, предполагаю, потому как от формы постановки его вопроса у меня глаз дёргается.
Если моё предположение верно, то автору нужно в цикле извлечь все идентификаторы и по ним получить объекты (эта задача не сложная).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 26.12.2011 в 15:23.
hwd вне форума  
 
Автор темы   Непрочитано 26.12.2011, 18:49
#25
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Во, а как можно получить все объекты чертежа?
zebra87 вне форума  
 
Непрочитано 26.12.2011, 18:59
#26
hwd

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


Цитата:
Сообщение от zebra87 Посмотреть сообщение
Во, а как можно получить все объекты чертежа?
Здесь смотри строки кода 86-92. С помощью этого кода получаешь идентификаторы всех объектов базы данных чертежа. Реализацию метода IsValid берёшь отсюда (из класса DbBrowser).
Имея на руках идентификаторы - свободно получаешь объекты. Код не сложный, думаю сообразишь, как переложить на лыжи делфей.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 26.12.2011, 19:44
#27
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


hwd
Ему через COM нужно.
zebra87
Смотри объектную модель AutoCAD. Объекты бывают двух типов:
1. Объекты (слои, типы линий, описание блоков, словари и т.д. - не графические)
2. Примитивы (графические объекты) - отрезки, полилинии, вставки блоков и т.д.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 26.12.2011, 20:36
#28
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Александр, я кстати воспользововался вашей программой по преобразованию dwg в bmp, а уже картинку вставлял, вставляет, но масштаб какой то маленький, реальный размер где то 1000:1, единственное что у меня получилось((( а как можно COM сервер настроить?

Вот только что получилось AttachExternalReference, добавил ссылку на шаблон, он появляется на чертеже. Вот только косяк в одном, он выдает ошибку если zScale = 0.0, а если координата z <> 0 то выводит, но в трехмерном пространстве

Последний раз редактировалось zebra87, 26.12.2011 в 20:54.
zebra87 вне форума  
 
Непрочитано 27.12.2011, 02:23
#29
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от zebra87 Посмотреть сообщение
Александр, я кстати воспользововался вашей программой по преобразованию dwg в bmp
Это не преобразование, а получение preview. Другой размер так не получишь.

Цитата:
Сообщение от zebra87 Посмотреть сообщение
а как можно COM сервер настроить?
Какой COM-сервер?
Цитата:
Сообщение от zebra87 Посмотреть сообщение
Вот только косяк в одном, он выдает ошибку если zScale = 0.0, а если координата z <> 0 то выводит, но в трехмерном пространстве
Нормально, если zScale = 1.0. Но вообще-то это тоже не то. А главное, судя по всему, нет понимания ЧТО именно нужно. Тогда появится и понимание того, КАК это можно сделать.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.01.2012, 08:53
#30
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Ну а все же, как можно добавлять несколько шаблонов на 1 чертеж? Например имея 2 шаблона (1 - Квадрат, 2 - Треугольник) добавив их на чертеж получить грубо говоря домик. Если не сложно по подробнее, а то эта тема не дает покоя((((
zebra87 вне форума  
 
Непрочитано 17.01.2012, 09:11
#31
Сергей Богатов


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


Цитата:
Сообщение от zebra87 Посмотреть сообщение
Ну а все же, как можно добавлять несколько шаблонов на 1 чертеж? Например имея 2 шаблона (1 - Квадрат, 2 - Треугольник) добавив их на чертеж получить грубо говоря домик. Если не сложно по подробнее, а то эта тема не дает покоя((((
Ответ на вопрос см. #27
Цитата:
Смотри объектную модель AutoCAD.
Открой ХЕЛП "документация для разработчиков". Там увидишь объектную модель и КУЧУ примеров

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.
Код:
[Выделить все]
Sub Ch10_InsertingABlock()
 ' Define the block
 Dim blockObj As AcadBlock
 Dim insertionPnt(0 To 2) As Double
 insertionPnt(0) = 0
 insertionPnt(1) = 0
 insertionPnt(2) = 0
 Set blockObj = ThisDrawing.Blocks.Add _
 (insertionPnt, "CircleBlock")

 ' Add a circle to the block
 Dim circleObj As AcadCircle
 Dim center(0 To 2) As Double
 Dim radius As Double
 center(0) = 0
 center(1) = 0
 center(2) = 0
 radius = 1
 Set circleObj = blockObj.AddCircle(center, radius)

 ' Insert the block
 Dim blockRefObj As AcadBlockReference
 insertionPnt(0) = 2
 insertionPnt(1) = 2
 insertionPnt(2) = 0
 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
 (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
 ZoomAll
 MsgBox "The circle belongs to " & blockRefObj.ObjectName
End Sub
и т.п.

P.S.
"Шаблон" в автокаде это не то что ты подразумеваешь. Смотри объектную модель и вообще прочитай про Автокад
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 17.01.2012, 17:05
#32
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Про блоки я тоже много примеров видел и читал про них, но как в этом примере который Вы привели, здесь добавление примитива и добавление его на чертеж. Если не программно, а как пользователь, то в блоках можно добавить путь к чертежу (файлу) и этот чертеж (файл) с его содержимым добавляется на рабочую поверхность, а вот программно видел только как добавлять примитивы. А так с блоками работать одно удовольствие. И если не сложно, можно название файла help-ы, а то я в этом совсем профан, только обучаюсь работе с автокадом(
zebra87 вне форума  
 
Непрочитано 17.01.2012, 21:05
#33
Кулик Алексей aka kpblc
Moderator

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


zebra87, ты не путаешь шаблоны и блоки?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.01.2012, 23:31
#34
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Вот смотрите, у блока есть такая вещь, как "путь", указываешь путь к *.dwg файлу, задаешь масштаб и место вставки и он добавляет содержимое файла на чертеж в заданном масштабе и точке. Вот мне нужно что то типо такого, но косяк весь произошел в том, что у блока есть куча методов по добавлению в него примитивов и их рисование, а вот такой функции я не нашел((( нашел только как добавить ссылку и добавил ее, но Александр Ривилис в сообщении №29 сказал что это не то и он прав.
zebra87 вне форума  
 
Непрочитано 17.01.2012, 23:47
#35
Кулик Алексей aka kpblc
Moderator

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


Понятно, полная путаница... Можно вставить блок, в том числе и из другого файла (точнее, вставленный блок будет полностью дублировать состав ModelSpace "другого файла"). Так что смотри на вставку блока:
Цитата:
Signature
Код:
[Выделить все]
RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation [, Password])
Object : ModelSpace, PaperSpace, Block
The objects this method applies to.

InsertionPoint Variant (three-element array of doubles); input-only
The 3D WCS coordinates specifying the location in the drawing to insert the block.

Name String; input-only
The name of the AutoCAD drawing file or the name of the block to insert. If it is a file name, include the .dwg extension and any path information necessary for AutoCAD to find the file.

Xscale Double; input-only; optional
The default equals 1.0. Must be a positive number.

Yscale Double; input-only; optional
The default equals 1.0. Must be a positive number.

Zscale Double; input-only; optional
The default equals 1.0. Must be a positive number.

Rotation Double; input-only; optional
The default equals 0.0 radians.

Password Variant; input-only; optional

RetVal BlockRef object
The placed block as a Block Reference object.

Remarks
Inserting a block into another block will create nested blocks.

Attempting to call the InsertBlock method with an uninitialized Name parameter results in unexpected behavior.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.01.2012, 08:57
#36
zebra87

1с программист
 
Регистрация: 24.12.2011
Тамбов
Сообщений: 16
<phrase 1=


Ух ты, вот этот метод я не пробывал, сегодня приду с работы, попробую) спасибо Вам Кулик Алексей за приведенный метод) сегодня как попробую, отпишу что да как.
zebra87 вне форума  
 
Непрочитано 18.01.2012, 09:19
#37
Сергей Богатов


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


Цитата:
Сообщение от zebra87 Посмотреть сообщение
Ух ты, вот этот метод я не пробывал, сегодня приду с работы, попробую) спасибо Вам Кулик Алексей за приведенный метод) сегодня как попробую, отпишу что да как.
Хм... а пост №31. Не тож самое?

Цитата:
Код:
[Выделить все]
Dim blockRefObj As AcadBlockReference
 insertionPnt(0) = 2
 insertionPnt(1) = 2
 insertionPnt(2) = 0
 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _
 (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 01.02.2012, 04:32
#38
azetown


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


Вот моя функция как вставлять блоки и работать с ними может пригодится

Код:
[Выделить все]
 
//FirstPoint - точка вставки блока
//N_count_block - порядковый номер блока (зависит название блока)
Function Insert_block_n(FirstPoint: OleVariant; N_count_block:integer): IAcadBlockReference;
var     //   вставляет блок "N_count_block"(если блока нет то создает его) в нужной точке автокада
    acB1: IAcadBlock;
    n:integer;
    N_block: string;
    i:integer;
    Ex_block :boolean;
    acbr1: IAcadBlockReference;

  function SetPAC(x,y,z:real) : OleVariant;
  begin
    result:=VarArrayCreate([0, 2], varDouble);
    result[0]:=x;
    result[1]:=y;
    result[2]:=z;
  end;

  function addBlock(n_name:integer):IAcadBlock;
  var FP_1: OleVariant;
      i_1:integer;
  begin   // Добавляет блок с именем: N_block
       FP_1:= VarArrayCreate([0, 2], varDouble) ;
       FP_1:=setpac(0,0,0);
       N_block:='Point_'+Inttostr(n_name);

       for i_1:=0 to AcadDocument1.Blocks.Count-1 do
       begin                        // очистить блоки
         if AcadDocument1.Blocks.Item(i_1).Name=N_block then
         begin
            acb1:=AcadDocument1.Blocks.Item(i_1);
            acb1.Item(0).delete;
         end;
       end;

       acb1:=AcadDocument1.Blocks.Add(FP_1,N_block);
       acb1.AddCircle(FP_1,1);
       acb1.AddLine(SetPAC(FP_1[0]-1.5,FP_1[1],    FP_1[2]),SetPAC(FP_1[0]+1.5,FP_1[1],    FP_1[2]));
       acb1.AddLine(SetPAC(FP_1[0],    FP_1[1]-1.5,FP_1[2]),SetPAC(FP_1[0],    FP_1[1]+1.5,FP_1[2]));
       if (n_name>0) then
       acb1.AddText(inttostr(n_name),setpac(FP_1[0]+1,FP_1[1]+1,FP_1[2]),1);

       acb1.Item(0).color:=acByBlock;
       acb1.Item(1).color:=acByBlock;
       acb1.Item(2).color:=acByBlock;
       if (n_name>0) then acb1.Item(3).color:=acByBlock;
  end;

begin  //   вставляет блок "N_count_block"(если блока нет то создает его) в нужной точке автокада

   begin
     n:=N_count_block;


//================================================================================
     begin
        N_block:='Point_'+Inttostr(n);

        Ex_block:=false;
        for i:=0 to AcadDocument1.Blocks.Count-1 do
          if AcadDocument1.Blocks.Item(i).Name=N_block then Ex_block:=true;

        if not Ex_block then addBlock(n);

        acbr1:=AcadDocument1.ModelSpace.InsertBlock(FirstPoint,N_block,1,1,1,0,'');
        acbr1.Layer:= 'Defpoints';
        acbr1.color:=acRed;
     end;

     AcadDocument1.Application.Update;

   end;
end;
azetown вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCAD и delphi 7, добавление шаблонов



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой 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