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

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

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

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

Всем доброго времени суток. Есть вопрос к профессионалам данного портала, мне нужно добавлять шаблоны в автокад, причем по несколько штук на чертеж. Примитивы чертить не проблема, а вот как пытаюсь добавить шаблон, сразу ошибка. Помогите пожалуйста, гугл мне не очень помог, везде только рисование примитивов, а про шаблоны ни слова.
Пробывал и добавлять шаблоны в блок Block.AddShape и на прямую, т.е. просто AddShape, ни в какую, выдает ошибки то OLE то типо не хватает каких то записей в какой то таблице((( я в этом профан, перечитал много литературы, но про шаблоны нигде ничего не сказано.
Просмотров: 10403
 
Непрочитано 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,450


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,450


Понятно, полная путаница... Можно вставить блок, в том числе и из другого файла (точнее, вставленный блок будет полностью дублировать состав 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