Штриховка в AutoCad через C++ Builder
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Штриховка в AutoCad через C++ Builder

Штриховка в AutoCad через C++ Builder

Ответ
Поиск в этой теме
Непрочитано 09.09.2014, 11:55 #1
Штриховка в AutoCad через C++ Builder
Jeyson
 
Регистрация: 09.09.2014
Сообщений: 10

Здравствуйте.
Пишу программу, позволяющую работать в AutoCad через С++ Builder 6.
Подключился к Автокаду, рисую примитивы, но споткнулся на штриховке
Требуется нарисовать окружность и залить ее. Окружность создается, но не заливается.
Главное и ошибок компилятор не выдает

Код:
Код:
[Выделить все]
    
     Variant Circle;
  
    IAcadHatch * Hatch;


  Variant SFirstPoint(OPENARRAY(int, (0, 2)), varDouble);
  SFirstPoint.PutElement(0.0,0);
  SFirstPoint.PutElement(0.0,1);
  SFirstPoint.PutElement(0.0,2);


  Variant Outline(OPENARRAY(int, (0, 0)), varDispatch);

  Outline=AcadDocument1->ModelSpace->AddCircle(SFirstPoint, 50);


    Hatch =AcadDocument1->ModelSpace->AddHatch (acHatchPatternTypePreDefined, WideString("SOLID"), True, Variant(acHatchObject));

   Hatch->AppendOuterLoop(Outline);
  Hatch->Evaluate();
  AcadDocument1->Application->Update();
В чем ошибка? Спасибо.

Последний раз редактировалось Jeyson, 09.09.2014 в 12:00.
Просмотров: 7158
 
Непрочитано 09.09.2014, 12:24
#2
trir


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


Тут
Код:
[Выделить все]
Hatch->AppendOuterLoop(Outline);
Вместо Outline должен быть массив!

Код:
[Выделить все]
Sub Example_AppendOuterLoop()
	' This example creates an associative hatch in model space, and then creates an outer loop for the hatch.

	Dim hatchObj As AcadHatch
	Dim patternName As String
	Dim PatternType As Long
	Dim bAssociativity As Boolean

	' Define the hatch
	patternName = "ANSI31"
	PatternType = 0
	bAssociativity = True

	' Create the associative Hatch object
	Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)

	' Create the outer loop for the hatch.
	' An arc and a line are used to create a closed loop.
	Dim outerLoop(0 To 1) As AcadEntity
	Dim center(0 To 2) As Double
	Dim radius As Double
	Dim startAngle As Double
	Dim endAngle As Double
	center(0) = 5: center(1) = 3: center(2) = 0
	radius = 1
	startAngle = 0
	endAngle = 3.141592
	Set outerLoop(0) = ThisDrawing.ModelSpace.AddArc(center, radius, startAngle, endAngle)
	Set outerLoop(1) = ThisDrawing.ModelSpace.AddLine(outerLoop(0).startPoint, outerLoop(0).endPoint)
	
	' Append the outer loop to the hatch object, and display the hatch
	hatchObj.AppendOuterLoop (outerLoop)
	hatchObj.Evaluate
	ZoomAll

End Sub
Цитата:
Signature

object.AppendOuterLoop loop

Object

Hatch
The object or objects this method applies to.

Loop

Object (array of objects); input-only
An array of objects forming a closed boundary. The array can consist of one or more objects. If more than one object is used, their endpoints must coincide for the loop to be created properly. The loop may contain the following types of objects: Line, Polyline, Circle, Ellipse, Spline, Region

Remarks

After the Hatch object has been created using the AddHatch method, add the outer loop. The outer loop must be closed and must be created before any inner loops can be added. After a valid outer loop has been created, add any inner loops, one at a time, using the AppendInnerLoop method.

Once you have finished defining the boundaries for the hatch, use the Evaluate method to calculate the hatch lines or fill for the boundaries, then use the Regen method to update the display of the hatch.
http://entercad.ru/acadauto.en/
trir вне форума  
 
Автор темы   Непрочитано 09.09.2014, 13:21
#3
Jeyson


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


Спасибо за ответ, однако это не помогло.
Дело в том что под VBA и Delphi примеры имеются и они работают, а мне нужно под C++ Builder.
Представленный ниже код работает без ошибок, но и штриховка не появилась. Может быть вариантные массивы создаю не так?
Но ведь окружность создается...

Код:
[Выделить все]
  Variant Outline[1];
    IAcadHatch * Hatch;
    double radius=1000;

    Hatch =AcadDocument1->ModelSpace->AddHatch (acHatchPatternTypePreDefined, WideString("SOLID"), True, Variant(acHatchObject));


  Variant SFirstPoint(OPENARRAY(int, (0, 2)), varDouble);
  SFirstPoint.PutElement(0.0,0);
  SFirstPoint.PutElement(0.0,1);
  SFirstPoint.PutElement(0.0,2);



   int BoundsA[2]={0,0};
   Outline[0] =VarArrayCreate(BoundsA,1,varDouble);
  Outline[0]=AcadDocument1->ModelSpace->AddCircle(SFirstPoint, radius);

   Hatch-> AppendOuterLoop(Outline[0]);
  Hatch->Evaluate();
  AcadDocument1->Application->Update();
Jeyson вне форума  
 
Непрочитано 09.09.2014, 13:44
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Посмотрите последний абзац http://forum.dwg.ru/showpost.php?p=1...postcount=1364
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.09.2014, 13:52
#5
Jeyson


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


Ну это уж совсем печально (не хочется верить что правда).
Я и подключился к автокаду и рисовал примитивы, создавал слои, назначал примитивам цвет и толщину и т.д. Даже поиск объектов делал. А тут споткнулся на штриховке.
Хочется верить что проблема со штриховкой решиться.
Спасибо. Но вопрос открыт.
Jeyson вне форума  
 
Непрочитано 09.09.2014, 14:04
#6
trir


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


Код:
[Выделить все]
Variant Outline(OPENARRAY(int, (0, 0)), varDispatch);
Outline[0]=AcadDocument1->ModelSpace->AddCircle(SFirstPoint, radius);
trir вне форума  
 
Непрочитано 09.09.2014, 14:07
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Тоже для справки http://www.itshop.ru/C-i-AutoCAD-Nek...aboty/l9i33874
И даже если реализовать через подгружаемую библиотеку через Autocad.Interpop.Common, чтобы иметь возможность писать ака VBA, не сильно вдаваясь в особенности реализации - то постоянно будете натыкаться на ограничения, изобретать костыли для обхода, получите трудно поддерживаемый и модифицируемый код . Подумайте сейчас на начальном этапе - нужно ли искусственно "загонять" себя на устаревшие технологии лишь потому - что он (билдер) привычнее.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.09.2014, 14:17
#8
Jeyson


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


Не работает

Variant Outline (OPENARRAY(int, (0, 0)), varDispatch); // Outline объявляется при создании массива

// если объявлять выше -не создает массив. сделал по-другому. Проблема осталась.
Код:
[Выделить все]
       Variant Outline[1];
      IAcadHatch * Hatch;
      double radius=1000;

      Hatch =AcadDocument1->ModelSpace->AddHatch (acHatchPatternTypePreDefined, WideString("SOLID"), True, Variant(acHatchObject));
    Variant SFirstPoint(OPENARRAY(int, (0, 2)), varDouble);

    SFirstPoint.PutElement(0.0,0);
    SFirstPoint.PutElement(0.0,1);
    SFirstPoint.PutElement(0.0,2);


    int Bounds[2]={0,0};
    Outline[0] = VarArrayCreate(Bounds,1,varDispatch);

    Outline[0]=AcadDocument1->ModelSpace->AddCircle(SFirstPoint, radius);


     Hatch-> AppendOuterLoop(Outline[0]);
    Hatch->Evaluate();
    AcadDocument1->Application->Update();
Jeyson вне форума  
 
Непрочитано 09.09.2014, 14:21
#9
trir


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


Код:
[Выделить все]
Variant Outline(OPENARRAY(int, (0, 0)), varDispatch);
Outline.PutElement(AcadDocument1->ModelSpace->AddCircle(SFirstPoint, radius));
Hatch-> AppendOuterLoop(Outline);
trir вне форума  
 
Автор темы   Непрочитано 09.09.2014, 14:34
#10
Jeyson


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


Ругается на строку
Outline.PutElement(AcadDocument1->ModelSpace->AddCircle(SFirstPoint, radius));

[C++ Error] Unit1.cpp(253): E2285 Could not find a match for 'Variant::PutElement(IAcadCircle *)'

----- добавлено через ~3 мин. -----

Сергей, Вы абсолютно правы, но мне тут огромный функционал не нужен, осталась только штриховка. Дело в том что на Buildere имеется довольно объемная и серьезная программа - расчет сетей водоснабжения и водоотведения. Ее просто необходимо дополнить функцией экспорта в автокад. Раньше делал DXF файл - работал но без штриховки и через одно место. Думал это решение..... если бы не штриховка.

----- добавлено через ~7 мин. -----
А вот рабочий код Delphi - он же работает! и исходник есть и запускается. Лично смотрел. Компания то одна Borland. Где-то маленькая неточность....

Код:
[Выделить все]
 
procedure TForm1.btnAddHatchClick(Sender: TObject);
var
  Circle, Hatch, Outline: OleVariant;
begin
  if not VarIsClear(Acad) then
  begin
    Circle:= Acad.ActiveDocument.ModelSpace.AddCircle(AcadPoint(0, 0), 50);
    Outline:= VarArrayCreate([0, 0], varDispatch);
    Outline[0]:= Circle;
    Hatch:= Acad.ActiveDocument.ModelSpace.AddHatch(acHatchPatternTypePreDefined, 'SOLID',
                                                    True, AcHatchObject);

    Hatch.AppendOuterLoop(Outline);
    Hatch.Evaluate;
    Acad.Update;
  end;
end;
Jeyson вне форума  
 
Непрочитано 09.09.2014, 14:44
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Если не получиться - как вариант: промежуточный файл с данными-результатами расчета и подгружаемая библиотека в автокад для экспорта. Заодно получите независимость программы расчета от версии автокада.
Сергей812 вне форума  
 
Непрочитано 09.09.2014, 14:44
#12
trir


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


Код:
[Выделить все]
Variant Outline(OPENARRAY(int, (0, 0)), varDispatch);
Outline.PutElement(IDispatch(AcadDocument1->ModelSpace->AddCircle(SFirstPoint, radius)));
Hatch-> AppendOuterLoop(Outline);
http://forums.autodesk.com/t5/visual...hi/td-p/337985

Circle : OleVariant; !!!
trir вне форума  
 
Автор темы   Непрочитано 09.09.2014, 15:03
#13
Jeyson


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


Хоть OleVariant - тоже самое.

[C++ Error] Unit1.cpp(277): E2352 Cannot create instance of abstract class 'IDispatch'
[C++ Error] Unit1.cpp(277): E2353 Class 'IDispatch' is abstract because of '__stdcall IDispatch::GetTypeInfoCount(unsigned int *) = 0'
[C++ Error] Unit1.cpp(277): E2285 Could not find a match for 'IDispatch::IDispatch(IAcadCircle *)'
[C++ Error] Unit1.cpp(277): E2031 Cannot cast from 'IAcadCircle *' to 'IDispatch'

Еще момент. Инициализация
AcadDocument1-это компонента после инсталляции библиотеки AutoCad.tlb
Автокад в момент запуска программы запущен. Коннектится автоматически.

Код:
[Выделить все]
   OleVariant AutoCAD;

  try
  {
    AcadDocument1->Connect();
  }
  catch (...)
  {
     //
  }
Jeyson вне форума  
 
Непрочитано 09.09.2014, 15:09
#14
trir


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


Код:
[Выделить все]
OleVariant Circle;
Circle = AcadDocument1->ModelSpace->AddCircle(SFirstPoint, 50);
Outline[0]= Circle;
Hatch->AppendOuterLoop(Outline);
trir вне форума  
 
Автор темы   Непрочитано 09.09.2014, 15:21
#15
Jeyson


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


Вот полный код с учетом последних изменений. Уже запутался... так и не штрихует. Завтра буду разбираться. Спасибо. Если будут мысли - напишите пожалуйста.

Код:
[Выделить все]
        OleVariant  Circle;
       IAcadHatch * Hatch;
       double radius=1000.0;
       OleVariant Outline[1];

    Variant AcadPoint(OPENARRAY(int, (0, 2)), varDouble);
    AcadPoint.PutElement(0.0,0);
    AcadPoint.PutElement(0.0,1);
    AcadPoint.PutElement(0.0,2);

    Circle= AcadDocument1->ModelSpace->AddCircle(AcadPoint, radius);

    Outline[0]= Circle;
    Hatch =AcadDocument1->ModelSpace->AddHatch (acHatchPatternTypePreDefined, WideString("SOLID"), True, Variant(acHatchObject));

    Hatch->AppendOuterLoop(Outline[0]);
    Hatch->Evaluate();
    AcadDocument1->Application->Update();
Jeyson вне форума  
 
Непрочитано 09.09.2014, 15:23
#16
trir


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


1. Вместо OleVariant Outline[1];
OleVariant Outline(OPENARRAY(int, (0, 0)), varDispatch);
2.
Hatch->AppendOuterLoop(Outline);
trir вне форума  
 
Автор темы   Непрочитано 11.09.2014, 05:13
#17
Jeyson


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


Еще раз здравствуйте и огромное спасибо, что уделили время для решения моего вопроса.
К сожалению C++ Builder для данных решений я признал не годным.
Принял ИМХО более верное решение - перейти на Delphi. Тут штриховка пошла с первого раза и проблем меньше, хоть и кодить после C++ не привычно.
Чтобы не создавать новую ветку хочу задать некоторые вопросы:
1. при экспорте из моей БД большого кол-ва данных и отображения их в качестве примитивов автокада (средствами моей программы) при попытке зумировать или панарамировать в процессе экспорта или что-либо еще (в самом автокаде) выходит ошибка "бла... бла... бла... Вызов был отклонен......". Я понимаю так, что это совместный доступ к БД автокада (может ошибаюсь). Как этого избежать? Думаю что алгоритм должен быть следующий: экспортируем... но если пользователь предпринял действия в автокаде, то экспорт приостановить, а когда автокад свободен от действий пользователя - возобновить экспорт.
Как бы это реализовать на Delphi?
2. Попытался запустить свою прогу на других машинах (я пишу под 2012 автокад) с 2010 автокадом - не пошла, 2013 - не пошла. Я так полагаю что tlb привязана к 2012 версии. Как можно обеспечить совместимость?
3. Как границы заливки закинуть в слой

Код:
[Выделить все]
  Zalivka:OleVariant;
AutoCADHatch:OleVariant;
....
               Zalivka:= VarArrayCreate([0, 0], varDispatch);
               Zalivka[0]:= AcadDocument1.ModelSpace.AddCircle(Points,Radius);

              AutoCADHatch:= AcadDocument1.ModelSpace.AddHatch(acHatchPatternTypePreDefined,
                                                                'SOLID',
                                                                 True,
                                                                 AcHatchObject);
               
               Zalivka.Layer:=lay[0].Name; // ошибка
               Zalivka[0].Layer:=lay[0].Name; // тоже ошибка
               AutoCADHatch.Layer:=lay[0].Name; // все отлично
Спасибо.
Jeyson вне форума  
 
Непрочитано 11.09.2014, 05:18
#18
trir


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


Цитата:
Как можно обеспечить совместимость?
tlb - для слабаков!
trir вне форума  
 
Автор темы   Непрочитано 11.09.2014, 05:20
#19
Jeyson


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


Сорри по третьему вопросу
строка

Код:
[Выделить все]
 Zalivka[0].Layer:=lay[0].Name;
сработала после перекомпиляции...
То ли я туплю, то ли среда разработки. Было у кого-нибудь что пишешь, компилишь - не работает. Потом закомментировал, компилишь - работает, разкомментировал - тоже работает..... ?

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от trir Посмотреть сообщение
tlb - для слабаков!
Я себя сильным в этих вопросах и не считаю, иначе бы не спрашивал.
Jeyson вне форума  
 
Непрочитано 11.09.2014, 06:47
#20
trir


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


Это был ответ на вопрос - позднее связывание не зависит от версии, до тех пор, пока не окажется, что нужного метода нет в старой версии

А чего не перейти на VS? Можно будет и дальше писать на C++, зато можно будет использовать NET API и ObjectARX
trir вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Штриховка в AutoCad через C++ Builder



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь своей программы с AutoCad через OpenGL Golem-iq Программирование 31 15.05.2015 14:03
Запуск "*.exe" файла через AutoCAD Leo_fmf Программирование 3 06.02.2012 14:59
Autocad зумирует только через ctrl mmahaev@mail.ru AutoCAD 4 29.04.2011 14:32
autocad штриховка сверху на скрытых линий AIL AutoCAD 11 24.01.2011 12:58
AutoCAD 2009LT баг, штриховка tcsandrew AutoCAD 3 11.08.2010 13:10