Предлагаю в этот топик скидывать свои примеры с описанием (по возможности) или кусочки программ использования разных функций и команд. Так как по справке не всегда понятно использование той или иной команды. И в примерах можно не найти все что нужно. Я думаю что многие оценят стоимость данного топика.
Начну первым.
Три примера по созданию панели инструментов (VB6).
Предлагаю небольшое дополнение - Обязательно указывать для какой версии написаны исходники. (хотя-бы на чём проверены)
Извеняюсь. Исходники выше проверены на Компас-3D 8+
Люди отзавитесь. Что никому не интересна эта тема? Почему никто не помогает развиваться этому топику? Не стесняйтесь.
Эх, исходников жалко, стока труда ;)
необязательно выкладывать полность весь исходник. Достаточно в исходнике осветить какую нибудь тему. Например: работа с базой данных, как нарисовать линию, запросы к системе, создание панелей свойств и так далее и тому подобное.
Вот здесь несколько прикладных библиотек http://www.kompas-sapr.com/index.php?option=com_content&task=blogcategory&id=15&Itemid=45 там ниппеля, пуансоны, фиксаторы, установочные кольца, винты, втулки, гайки и опоры
Как создать пространственную кривую - ломаную. VB6. Компас-3D 8+ SP2.
история:
1. Создать ломанную
2. Добавить вершину между двумя вершинами
3. Удалить вершину
4. Получить параметры вершины с индексом
5. Узнать координаты вершин ломаной
Всяко-разно. VB6. Компас-3D 8+ SP2.
история:
1. Получить индекс объекта в дереве построения по имени и типу объека
Друзья помогайте. Я не в состоянии охватить все темы API. Или уже никто ничего не пишит под компас.
Цитата: olden от 16.11.06, 23:40:58
Друзья помогайте. Я не в состоянии охватить все темы API. Или уже никто ничего не пишит под компас.
Пишут. Но, перед тем, как выкладывать, исходники "причесать" надо, комментарии туда напихать всякие, а это - время... А время - это... :)
Цитата: IronMaxxx от 17.11.06, 10:51:43
исходники "причесать" надо
Тогда неприменно ждем «после визита парикмахера». :) :) :)
Исходник и исполняемый файл для Компас-7 и Delphi 7, реализующие вызов Компаса, построение плоских и пространственных графических моделей по заданным размерам. Для плоского чертежа реализована штриховка и простановка размеров. Пример демонстрировался на региональном семинаре "Аскон-Центр" в Липецком государственном техническом университете 21 ноября 2006 г, включен в учебное пособие по дисциплине "Программное обеспечение САПР" для студентов специальности "Автомобиле- и тракторостроение" специализации "САПР" (правда, в более документированном виде).
С уважением - автор.
Программа автоматически сохраняет все чертежи Компаса в выбранной папке в формате gif (рисунков).
Высылаю файлы проекта, необходимо только добавить в проект VB в меню Project-References элементы:
OLE-Automation
Kompas6API2D5COM
Kompas6API3D5COM
Kompas6API5
Kompas6Constants
Kompas6Constants3D
просто напротив них поставить галочки, и запускайте, должно работать.
Au revoir.
Спасибо Всем, кто помогает в развитии этой темы. И до новых встреч на страницах этой темы.
Я смотрю тема заглохла. У меня тоже неполучается. Но обещаю что буду продолжать вылаживать свои описания. Люди подключайтесь. Вылаживайте. Зачем мучатся в одиночку. Если разобрался, поделись мыслями своими.
Вот мой код содания массива операций по концетрической сетке. при работе Компас выдает сообщение: "Вырожденый обьект". Что я делаю не так.
Пример кода:
mass1:=ksEntity(part.NewEntity(o3d_circularCopy));
massoSetke:=ksCircularCopyDefinition(mass1.GetDefinition);
massoSetke.SetAxis(entityAxisPLane);
entityCollection:=ksEntityCollection(part.EntityCollection(o3d_bossExtrusion));
ent:=ksEntity(part.NewEntity(o3d_bossExtrusion));
massoSetke.GetOperationArray();
ent:=ksEntity(entityCollection.GetByIndex(0)) (так как у меня только одна операция);
Kompas.ksMessage(ent.name);
mass1.Create;
Просмотрел ответы, а примеров то нет! Если можно , то приведите пример на Delphi код построения одной линии в Компас 7+ со всеми подключенными модулями и интерфейсами.
Вот пример. правда для 8+. но надеюсь поможет. делфи7
Спасибо за отклик! ;)Пример помог разобраться в процедурах построения графических примитивов. Но если создавать библиотеки вручную (я имею ввиду прорисовывать каждый фрагмент схемы :((()), то времени не наберешься. Можно сделать так, чтобы опрашивать лист Компаса, где нарисованы некоторые фрагменты и дольше их использовать( вернее сгнерированный код) в создании библиотеки. Если возможно, то наведите примерный код программы (на Delphi :shu:). Заранее спасибо!
Господа! Исходники это конечно хорошо, но подскажите литературу, где можно почитать о программировании библиотек! :?: Хотелось бы не только самому освоить, но и научить студентов!
Единственная, в своем роде, литература (которая мне встречалась) - это Компас-Мастер SDK. Она идет вместе с компасом. И данный форум. ВСЕ! А чуть не забыл. И вот эта ссылка: http://support.ascon.ru/download.php?act=cat&cat=3#97 .Ну а теперь точно ВСЕ!
Цитата: olden от 11.03.07, 13:01:10
Единственная, в своем роде, литература (которая мне встречалась) - это Компас-Мастер SDK. Она идет вместе с компасом. И данный форум. ВСЕ! А чуть не забыл. И вот эта ссылка: http://support.ascon.ru/download.php?act=cat&cat=3#97 .Ну а теперь точно ВСЕ!
Мда... оно очень старое, еще для 5-й версии.
Вы хотите библиотеки писать в чем API, Auto или COM. Если в AUTO, то литература по ссілке то, что надо. Советую в API: там и кода меньше и она более понятна.
Что-то все забыли про эту тему. Люди отзавитесь. Не уж то никто ничего не пишит?
Пишем потихоньку......
Только не сезон для глобальных вещей.
Вот у нас в строительной конторе - сезон попёр. И соответственно директор достал весь проектный отдел (2 чел) времени чаю хлебнуть нету, а писать программу темболее. Да ещё один перец поставил вместо 5.11 - 8+ . Ну соответственно коэфициент производительности упал до минимума, и ещё гордится........ скоро по чайнику получит.
Пишу дома вечерами, пару часиков в VB-6. Прога специфическая, в основном связь с екселем, ну и чертит потихоньку.
вот пример библиотеки с формой на делфи7
Пример выбора элемента детали методом Choose
Если интересуют примеры, написанные на Visual C++, на следующей неделе выложу программу, генерирующую по чертежу в КОМПАСЕ команды для ЧПУ.
Как и обещал - построение эвольвенты !!!! извините, причесал как мог.... :o:
Пример построения 3д модели детали с резьбой Патрубок
Пример построения операции приклеить выдавливанием с указанием пользователем грани
Приветик. Подскажите, пожалуйста, как создать сборку в автоматизированном режиме в компас 8+ из Дельфи.
Цитата: Death от 08.05.07, 15:02:33
Если интересуют примеры, написанные на Visual C++, на следующей неделе выложу программу, генерирующую по чертежу в КОМПАСЕ команды для ЧПУ.
Очень даже интересует. Киньте, подалуйста на форум, или мне на мыло!!!
Заранее спасибо
Цитата: Death от 08.05.07, 15:02:33
Если интересуют примеры, написанные на Visual C++, на следующей неделе выложу программу, генерирующую по чертежу в КОМПАСЕ команды для ЧПУ.
Конечно очень интересует. UpLoad прям сюда.
Вот обещанный генератор кодов ЧПУ. Не всё в этой программе идеально, но для примера должно хватить и этого.
пример заполнения основной надписи текущего чертежа и присваивания ему имени файла
пример использования функции UserSelectEntity
Пример создания произвольного ассоциативного вида с модели
примеры использования функции UserGetPlacementAndEntity:
1. Выбор цилиндрической поверхности и плоской.
2. Выбор двух цилиндрических поверхностей.
Финальная версия библиотеки, генерирующей команды ЧПУ. Генерирует команды как для ЧПУ, так и для машины плазменной резки типа "Портал". В проекте присутствуют все файлы, необходимые для успешной компиляции. Это даже не пример, а готовая программа! Кроме того, архив содержит краткую справку, которая поможет быстро разобраться во всех функциях библиотеки. Разработано на Visual C++ 8.0 для КОМПАС V7. Не пропустите!
Пример построения операции по сечениям с указанием направления в виде цилиндрической спирали. Делфи7. Компас 9
Пример типа Дерево модели. Если че пишите на личку будем исправлять. Компас 9SP1
Две библиотеки для Компас-Макро. Одна скрывает начала координат и координатные плоскости текущей сборки и всех входящих деталей/подсборок. Вторая показывает.
2.11.07 Для ускорения работы отключена обработка стандартных компонентов. Добавлены два макроса для обработки только деталей/подсборок первого уровня.
Друзья! Кто-нибудь помогите! Напишите как мне пошагово настроить Delphi7 для создания библиотек и приложений. Открываю файл примера step1, нажимаю F9, но он не компилируется - вылетает с ошибкой...
Цитата: sorockinalex от 15.11.07, 11:26:13
Друзья! Кто-нибудь помогите! Напишите как мне пошагово настроить Delphi7 для создания библиотек и приложений. Открываю файл примера step1, нажимаю F9, но он не компилируется - вылетает с ошибкой...
Это конечно не та ветка, но все же отвечу.
Смотри документ "Компиляция библиотек под К9.doc"
"Delphi Automation
1. Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующее.
1.1. Вызовите команду Project - Import type library - Add.
1.2. Выберите файл kAPI5.tlb.
2. Укажите путь к корневой папке размещения примеров (Unit dir name).
3. Нажмите кнопку Create Unit.
4. Переименуйте полученный файл в KsTLB.pas и отредактируйте его первую строку."
:w:
Друзья! Помогите пожалуйста! Поситал файлик sdk.hlp но ничего не понял как сделать библиотеку. Загрузил файл примеры step1, нажал f9, но он не компилируется - вылетает с ошибкой. Читал ещё какой-то файл "компиляция под компас 9", не понял. Поэтому прошу помощи у Вас. Напишите по пунктам что нужно сделать, чтобы настроить delphi 7 для создания библиотек и приложений компас. От самого начала и до компиляции простейшей библиотеки step1. Очень нужна ваша помощь! Замучался уже!
Разобрался! Скачал файл 3 метра с pdf файлами.
Не знаю почему компас не включает их в свой дистрибутив... :%:
Но есть проблемка:
1) Делаю всё по примеру. Создал каталог C:\RTWExamples\Example1
В нём лежат все файлы pas и dcu (из папки include SDK), там же сохранён мой проект библиотеки.
2) код программы:
PROJECT1.dpr
library Project1;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
{$R 'Example1.res' 'Example1.rc'}
uses
SysUtils,
Classes,
Windows,
LDefin2D,
ksAuto,
KsTLB,
command in 'command.pas';
{$E rtw}
{$R *.res}
var iKompas : KompasObject;
function LibraryName: PChar; pascal;
begin
result := 'Библиотека Example1 на Delphi';
end;
function LibraryID: UINT; pascal;
begin
result := LIB_ID;
end;
procedure LibraryEntry (command: WORD); pascal;
begin
iKompas := KompasObject(CreateKompasObject);
if iKompas <> nil then
Exit;
case command of
1 : iKompas.ksMessage ( 'Болт 7798' );
2 : iKompas.ksMessage ( 'Шайба 18123' );
3 : iKompas.ksMessage ( 'Гайка 6393' );
4 : iKompas.ksMessage ( 'Гайка 5915' );
5 : iKompas.ksMessage ( 'Гайка 15521' );
6 : iKompas.ksMessage ( 'Штифт 10774' );
end;
iKompas.ksMessage('ПРИВЕТ!!!');
iKompas := nil;
end;
exports
LibraryName name 'LIBRARYNAME',
LibraryEntry name 'LIBRARYENTRY';
begin
end.
COMMAND.rh
#ifndef __COMMAND_RH
# define __COMMAND_RH
#define LIB_ID 1000
#define COMMAND_1 1
#define COMMAND_2 2
#define COMMAND_3 3
#define COMMAND_4 4
#define COMMAND_5 5
#define COMMAND_6 6
#endif
EXAMPLE1.rc
#ifndef __COMMAND_RH
#include "command.rh"
#endif
// Описание меню команд библиотеки
// Примечание: идентификаторы команд должны быть в интервале от 1 до 900
1000 MENU
{
MENUITEM "Болт ГОСТ 7798-70", COMMAND_1
MENUITEM "Болт ГОСТ 18123-72", COMMAND_2
POPUP "ГАЙКИ"
{
MENUITEM "Гайка ГОСТ 6393-73", COMMAND_3
POPUP "ГАЙКИ ШЕСТИГРАННЫЕ"
{
MENUITEM "Гайка ГОСТ 5915-70", COMMAND_4
MENUITEM "Гайка ГОСТ 15521-50", COMMAND_5
}
}
MENUITEM "Штифт ГОСТ 10774-80", COMMAND_6
}
//Определение BMP-слайдов для команд библиотеки
COMMAND_1 BITMAP "1.bmp"
COMMAND_2 BITMAP "2.bmp"
COMMAND_3 BITMAP "3.bmp"
COMMAND_4 BITMAP "4.bmp"
COMMAND_5 BITMAP "5.bmp"
COMMAND_6 BITMAP "6.bmp"
//Размеры окна вывода BMP-слайда:
1000 RCDATA {
160 // Размер по горизонтали
140 // Размер по вертикали
}
// Имя библиотеки
STRINGTABLE
{
1000 "Библиотека Example1 на Delphi"
}
// Пиктограмма для свёрнутого окна библиотеки
1000 ICON "Example1.ico"
COMMAND.pas
unit command;
interface
const LIB_ID = 1000;
COMMAND_1 = 1;
COMMAND_2 = 2;
COMMAND_3 = 3;
COMMAND_4 = 4;
COMMAND_5 = 5;
COMMAND_6 = 6;
implementation
end.
При компиляции выдаёт такую ошибку:
[Warning] Project1.dpr(28): Symbol 'KompasObject' is specific to a platform
[Warning] Project1.dpr(42): Symbol 'KompasObject' is specific to a platform
строка 28: var iKompas : KompasObject;
строка 42: iKompas := KompasObject(CreateKompasObject);
научите, пожалуйста! что мне нужно сделать, чтобы этих ошибок не выдавалось?
ЦитироватьЭто конечно не та ветка, но все же отвечу.
Смотри документ "Компиляция библиотек под К9.doc"
"Delphi Automation
1. Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующее.
1.1. Вызовите команду Project - Import type library - Add.
1.2. Выберите файл kAPI5.tlb.
2. Укажите путь к корневой папке размещения примеров (Unit dir name).
3. Нажмите кнопку Create Unit.
4. Переименуйте полученный файл в KsTLB.pas и отредактируйте его первую строку."
Work
А это вообще не знаю к чему. Сделал как было в KDMA_02.pdf и ничего из перечисленного выше не делал.. Простейшая библиотека работала. А когда дальше пошёл - начал выдавать описанную ошибку...
Сейчас нашёл в яндексе. Оказывается, это просто предупреждение о возможном несоответствии на другой платворме или типа того.
Библиотека в компасе загружается, но пунктов никаких почему-то нет... И картинок подгруженных тоже! Картинки и иконка лежат тоже в папке Example1... Помогите, друзья!!!
Уважаемый sorockinalex!
Вы вчера скачали где-то "3 метра с pdf с файлами" по по созданию библиотек. Не могли бы скинуть ссылку на эти материалы?
Блин. Я и не помню уже... Попробуйте поискать в Download секции - тут вверху окна ссылка
Цитата: Николай от 16.11.07, 09:33:17
ссылку на эти материалы
http://support.ascon.ru/download.php?act=cat&cat=3#97
Пример заполнения основной надписи чертежа
Делфи 7
Пример считывания данных с основной надписи чертежа с указанием номера ячейки
Делфи 7
Пример вставки стандартной детали из библиотеки моделей в сборку с указанием местоположения и присвоением переменных. Делфи 7. Компас 9
Пример из книги Максима Кидрука:
Мини-САПР, создающая по минимальному количеству исходных данных 3D-модель зубчатого колеса (как прямозубого, так и косозубого).
Ребят, а подскажите как создать подсборку в сборке ??
создаете отдельную сборку-вставляете ее в другую сборку и она становится подсборкой. Если надо сделать из текущей - пересохраняете имеющуюся с именем подсборки - удаляете лишние детали. В головной сборке удаляете детали подсборки и вставляеете туда подсборку.
Ну как-то так.
Спасибо.... :) но уж больно хитро-мудро.
Скрее всего должен быть более простой способ , без пересохранений и вставок других сборок)))
В КОМПАС 10 есть компонент создания детали, а так же компонент создания подсборки.
С деталью понятно : ksDocument3D::CreatePartFromFile или ksDocument3D::CreatePartInAssembly.
Может и подсборку можно аналогично создать???
Если есть у кого пример, буду признателен.
PS
не совсем понял по поводу "...Если надо сделать из текущей ..."
Есть у кого скомпилированная библиотека генерации команд для станка с ЧПУ, исходники которой представлены в посте
http://forum.ascon.ru/index.php/topic,5841.msg44925.html#msg44925?
Самому скомпилировать не удается по причине отсутствия компилятора. А посмотреть очень хочется.
помогите TestTypes.dcu найти компонент для Delphi
bymer2@list.ru жду....................
Есть вопрос товарищи, есть поподробней по программированию Компаса, чем хелп и примеры в сдк, какие нибудь туториалы или маны? гуглил гуглил но ничего конкретного не нашел... буду благодарен.
Цитата: chifir от 09.06.09, 15:54:18
...есть поподробней по программированию Компаса, чем хелп и примеры в сдк, какие нибудь туториалы или маны?
Пока не видел ничего лучше вот этих пособий:
http://download.ascon.ru/public/educat/master/DelphiAUTO.zip
http://download.ascon.ru/public/educat/master/BuilderAUTO.zip
спасибо большое, уже нашел) но некоторые вопросы до сих пор остались...
Цитата: chifir от 09.06.09, 15:54:18
Есть вопрос товарищи, есть поподробней по программированию Компаса, чем хелп и примеры в сдк, какие нибудь туториалы или маны? гуглил гуглил но ничего конкретного не нашел... буду благодарен.
SDK 50% информации, правда нужно код прорабатывать, но зато практика. Начинайте с простого и все у Вас получится.
Привет всем, я новичок, так что ногами не пинать:) Решил не создавать новую тему, а написать сюда. Решил вот написать свою программу на Делфи для Компаса. Скачал много исходников, но никак не могу скомпилировать ни один проект :(. Делфи знаю на среднем уровне, но таких программ в жизни не писал. Так вот, скажите мне, почему у меня постоянно выскакивает ошибка при подключения модуля:
Chertezh_1 in 'Chertezh_1.pas';
Спасибо, все кто откликнется!!!
Цитата: MalCer от 15.07.09, 19:07:42
Привет всем, я новичок, так что ногами не пинать:) Решил не создавать новую тему, а написать сюда. Решил вот написать свою программу на Делфи для Компаса. Скачал много исходников, но никак не могу скомпилировать ни один проект :(. Делфи знаю на среднем уровне, но таких программ в жизни не писал. Так вот, скажите мне, почему у меня постоянно выскакивает ошибка при подключения модуля:
Chertezh_1 in 'Chertezh_1.pas';
Спасибо, все кто откликнется!!!
Файлы *.pas сгенерираванные под Dilphi7, для Компас V11, V10 можно скачать здесь:
http://mariupolsapr.narod.ru/
пример проекта библиотеки http://mariupolsapr.narod.ru/lib/animaciq3d.rar
Люди может кто помочь)))), в общем задача такая, необходимо создать прикладную библиотеку в делфи для компаса, кажется со всем понятно, только в прямоугольнике не могу сделать фаски или скругления, заранее всем спасибо....
Кстати кому может поможет у меня есть пример в СИ, а надо в делфи...
reference arr = ::CreateArray (CORNER_ARR, 0); // создать массив параметров углов
CornerParam par; // структура параметров угла
par.index = 5; // индекс угла
par.fillet = 0; // признак фаски
par.l1 = 345; // длина фаски 1 сегмента
par.l2 = 456.987; // длина фаски 2 сегмента
::AddArrayItem (arr, -1, &par, sizeof (CornerParam)); // добавить угол в массив
par.index = 45; // индекс угла
par.fillet = 0; // признак фаски
par.l1 = 345; // длина фаски 1 сегмента
par.l2 = 456.987; // длина фаски 2 сегмента
::AddArrayItem (arr, -1, &par, sizeof (CornerParam));// добавить угол в массив
par.index = 65; // индекс угла
par.fillet = 0; // признак фаски
par.l1 = 345; // длина фаски 1 сегмента
par.l2 = 456.987; // длина фаски 2 сегмента
::AddArrayItem (arr, -1, &par, sizeof (CornerParam));// добавить угол в массив
par.index = 85; // индекс угла
par.fillet = 0; // признак фаски
par.l1 = 345; // длина фаски 1 сегмента
par.l2 = 456.987; // длина фаски 2 сегмента
::AddArrayItem (arr, -1, &par, sizeof (CornerParam));// добавить угол в массив
int count = ::GetArrayCount (arr); // количество элементов в массиве
for ( int i = 0; i < count; i++ ) {
// выводим параметры углов в окне сообщения
char buf[128];
if ( ::GetArrayItem (arr, i, &par, sizeof (CornerParam))) {
::sprintf ( buf, "индекс элемента %i равен %i; %i, %f, %f", i,
par.index, par.fillet, par.l1, par.l2);
::Message (buf);
}
}
::ExcludeArrayItem (arr, 2); // удаляем второй элемент массива
count = ::GetArrayCount (arr); // количество элементов в массиве
for ( int i = 0; i < count; i++ ) {
// выводим параметры углов в окне сообщения
char buf [128];
if ( ::GetArrayItem (arr, i, &par, sizeof (CornerParam))) {
::sprintf (buf, "индекс элемента %i равен %i; %i, %f, %f", i, par.index,
par.fillet, par.l1, par.l2 );
::Message( buf );
}
}
if ( ::GetArrayItem (arr, 1, &par, sizeof (CornerParam))) {
// изменяем параметры элемента с индексом 1
par.index = 0;
par.fillet = 0;
par.l1 = 0;
par.l2 = 0;
::SetArrayItem( arr, 1, &par, sizeof(CornerParam) );
}
count = ::GetArrayCount (arr); // количество элементов в массиве
for ( int i = 0; i < count; i++ ) {
// выводим параметры углов в окне сообщения
char buf[128];
if ( ::GetArrayItem (arr, i, &par, sizeof (CornerParam))) {
::sprintf (buf, "индекс элемента %i равен %i; %i, %f, %f", i, par.index,
par.fillet, par.l1, par.l2);
::Message( buf );
}
}
::ClearArray (arr); // очищаем массив
char buf[128];
::sprintf (buf, "кол-во элементов = %i", ::GetArrayCount (arr));
::Message (buf);
::DeleteArray (arr); // удаляем массив
Привет!!! Подскажите пожалуйста как делать сопряжения деталей 3D в сборке с помощью Delphi 7.
Цитата: lewka от 19.08.10, 14:02:19
Привет!!! Подскажите пожалуйста как делать сопряжения деталей 3D в сборке с помощью Delphi 7.
//Добавить сопряжение совпадение
PartCollection1:=ksPart(iDoc3DSborka.GetPart(-1));
EntityCollection:=
ksEntityCollection(PartCollection1.EntityCollection(o3d_pointCS));
Entity1:=ksEntity(EntityCollection.GetByIndex(0));
PartCollection1:=ksPart(iDoc3DSborka.GetPart(0));
EntityCollection:=
ksEntityCollection(PartCollection1.EntityCollection(o3d_pointCS));
Entity2:=ksEntity(EntityCollection.GetByIndex(0));
iDoc3DSborka.AddMateConstraint(mc_Coincidence,Entity1,Entity2,0,0,0);
iDoc3DSborka.RebuildDocument;
Кто-нибудь может выложить исходник программы или библиотеки, который создает чертеж со всеми наворотами ( тт , указанная и не указанная шероховатость , и т.д.) . И если можно то в VB6 . Хоть что-нибудь .
У меня тоже такая потребность, но, похоже, все программеры игнорируют VB и подробной методички под Бейсик не предвидится.
Здравствуйте, а исходных примеров к книге Максима Кидрука (КОМПАС-3D V10 на 100 %) нет ни у кого? А то по книге делаю, а многое (даже на начальном этапе не работает). в интернете не нашел (((
aalleexxaa, привет. У меня есть диск к книге Кидрука, если хочешь, могу прислать исходники, пиши почту @.
жду :)
Цитировать
aalleexxaa@mail.ru
пасиба
Проверяйте почту, предлагаю сотрудничать. Я отправил только 6 главу, там где исходные коды приложений, есть еще и другие главы, если надо , пишите
Выкладываю свой примерчик который умеет:
1. Менять форматы чертежа (A3 ,А4 портрет, ландшафт)в одно нажатие кнопки на панели кнопок
2. Нарисовать две пересекающиеся прямые, что то типа начала координат в пару нажатий кнопки
3. Нарисовать прямоугольник (заготовку) детали .
После подключения библиотеки включите отображение панели инструментов "Подготовка чертежа"
(//)
Все создано под Компас 3-D V13 sp1 и в Borland Delphi 7
Спешу поделиться своим примерчиком "Диалог открытия файла с предварительным просмотром".
Написано и проверено в Компас 3D V13, Windows 7 sp1 32bit, Delphi 7
Что мне нужно было от этого диалога:
- возможность изменения размеров окна предпросмотра при открытии файлов стандартным диалогом стиля Windows XP
- находить, просматривать и открывать файлы измененные за какой то период, допустим за последний месяц
Что он умеет:
- изменять размеры формы предварительного просмотра которая приклеена рядом к диалогу
- искать файлы по имени и дате изменения, и показывать их в окне предпросмотра
Плюсы:
- работает, уже пол дня им пользовался ))))
Минусы:
- поиск (вернее просмотр из поиска) некорректно работает под Windows XP
- нет возможности выбора нескольких файлов(можно сделать кнопку типа "Открыть в фоне не закрывая диалог")
- не задействована галочка "Только чтение"(забыл про нее совсем)
- пример не является образцом хорошего программирования, и не отлажен до конца
Скриншот, исходники(source.7z) и компилированая библиотека(EventsAuto.7z.001 и 002) прилагаются.
классная идея с большим окном предпросмотра, интересно в 14-ом компасе изменения в этом плане есть или все по старому?
только вот при открытии многолистового документа вижу в окне только первый лист, нельзя просматривать в окне растровые форматы, новый диалог не работает при вставке рисунка в чертеж.
полностью готовая библиотека с сиходниками от yarikv
что умеет:
- создавать форму в библиотеке;
- в m3d a3d документах работает с полями 'обозначение' и 'наименование' в свойствах дерева детали;
- в kdw spw cdw документах работает с полями основной надписи 'обозначение' и 'наименование';
- плюс описание по использованию библиотеки;
- написана в Delphi.
Реализовал вращение компоненты посредством метода RotateComponent (как пример использования).
//-------------------------------------------------------------------------------
// Функция поворачивает первую компоненту открытой сборки на 70 градусов вокруг оси 0X.
// Фиксация компонент сборки должна быть отключена.
//
// "MyKompasObject" - это переименованный "kompas" (тип KompsasObject), например, в примере Step3d2 Visualc AUTO; определяется в функции void GetKompas().
// ---
void RotateComponent() {
CString title_dialog; title_dialog.Format( _T( "Функция %s" ), _T( "RotateComponent" ) ); // Заголовок окна сообщений функции
CString tmstr;
ksDocument3DPtr cur_doc = MyKompasObject->ActiveDocument3D();
if( cur_doc == NULL ) {
MessageBox(NULL, _bstr_t( _T("*** cur_doc == NULL. Выход.") ), title_dialog, MB_OK); return;
}
ksPartPtr part = cur_doc->GetPart( 0 );
if ( !part ) {
MessageBox(NULL, _T("*** не удалось получить part. Выход." ), title_dialog, MB_OK); return;
}
ksComponentPositionerPtr positioner = cur_doc->ComponentPositioner();
if( positioner == NULL ) {
MessageBox(NULL, _bstr_t( _T("*** positioner == NULL. Выход.") ), title_dialog, MB_OK); return;
}
if(!(positioner->SetAxisByPoints( 0,0,0,100,0,0 ))) { // Указание оси по двум точкам (ось 0X)
MessageBox(NULL, _T( "*** positioner->SetAxisByPoints() не отработал. Выход." ), title_dialog, MB_OK); return;
}
if( positioner->Prepare( part, pnRotate ) != 0 ) {
MessageBox(NULL, _T( "*** positioner->Prepare() не отработал. Выход." ), title_dialog, MB_OK); return;
}
if(!(positioner->RotateComponent( ( 3.1415926535897932384626433832795*(70.0/180.0) ) ))) { // Указание поворота на 70 градусов, перевод в радианы
MessageBox(NULL, _T( "*** positioner->RotateComponent() не отработал." ), title_dialog, MB_OK);
}
if(!(positioner->Finish())) {
MessageBox(NULL, _T( "*** positioner->Finish() не отработал. Выход." ), title_dialog, MB_OK);
return;
}
cur_doc->RebuildDocument(); // Перестроить сборку
return;
}
Желаю успехов!
В дополнение к сообщению:
Выкладываю свой примерчик который .... http://forum.ascon.ru/index.php/topic,5841.msg157208.html#msg157208 (http://forum.ascon.ru/index.php/topic,5841.msg157208.html#msg157208)
добавлена кнопка отображениия листа без рамки. иногда очень полезно т.к. эскизы, в отличии от чертежей, не позволяют создавть виды -> масштабы.
Код реализует доступ к интерфейсу поверхности сети точек.
Он получает грани детали, открытой в Компасе, и создает для них поверхности IMeshPointsSurface.
Внимание!
У меня этот код В КОМПАСе версии 14 (sp1 и sp2) приводил к его вылету, на разных машинах. Предположительно, из-за наличия "косяка" в этих версиях. Это легко проверить, попытавшись вручную создать поверхность по сети точек для грани.
В версии 15 sp1 код работает нормально.
//-------------------------------------------------------------------------------
// Получить поверхности как сеть точек для всех граней открытого документа
// ---
void MakeMeshPointSurfaceAllFaces() {
CString title_dialog; title_dialog.Format( _T( "Функция %s" ), _T( "MakeMeshPointSurfaceAllFaces" ) );
CString tmpstr;
// 01. Получаем интерфейс открытого документа
ksDocument3DPtr opened_document_3d = MyKompasObject->ActiveDocument3D(); // MyKompasObject - то же самое, что и kompas в примерах (объект KompasObjectPtr)
if ( !opened_document_3d ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс opened_document_3d не получен. Выход.") ), title_dialog, MB_OK); return;
}
IKompasDocument3DPtr kompas_opened_document_3d( IUnknownPtr( ksTransferInterface( opened_document_3d, ksAPI7Dual, 0), false) );
if ( !kompas_opened_document_3d ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс kompas_opened_document_3d не получен. Выход.") ), title_dialog, MB_OK); return;
}
// 02. Получаем интерфейс корневой детали
ksPartPtr top_part_opened_doc = opened_document_3d->GetPart( pTop_Part );
if ( top_part_opened_doc == NULL ) {
MessageBox(NULL, _T("*** не удалось получить top_part_opened_doc. Выход." ), title_dialog, MB_OK); return;
}
ksBodyPtr ptr_body = top_part_opened_doc->GetMainBody(); // Объявление переменной типа "Указатель на интерфейс ksBody"
if ( ! ptr_body ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс ptr_body не получен. Выход." ) ), title_dialog, MB_OK); return;
}
// 03. Получаем коллекцию граней корневой детали
ksFaceCollectionPtr face_collection = ptr_body->FaceCollection();
if ( ! face_collection ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс face_collection не получен. Выход." ) ), title_dialog, MB_OK); return;
}
tmpstr.Format( _T("В модели %ld граней."), face_collection->GetCount() ); // Показать число граней в коллекции
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
// 04. Получаем интерфейс коллекций поверхностей IMeshPointsSurfaces открытого документа
IPart7Ptr doc_part7 = kompas_opened_document_3d->TopPart;
if( doc_part7 == NULL ) {
MessageBox(NULL, _bstr_t( _T("*** doc_part7 == NULL. Выход.") ), title_dialog, MB_OK); return;
}
ISurfaceContainerPtr surface_container( doc_part7 );
if ( ! surface_container ) {
MessageBox(NULL, _bstr_t( _T( "*** surface_container не получен. Выход." ) ), title_dialog, MB_OK); return;
}
// 04. Получаем интерфейс коллекций поверхностей IMeshPointsSurfaces открытого документа
IMeshPointsSurfacesPtr mesh_points_surfaces( surface_container->MeshPointsSurfaces );
if ( ! mesh_points_surfaces ) {
MessageBox(NULL, _bstr_t( _T( "*** mesh_points_surfaces не получен. Выход." ) ), title_dialog, MB_OK); return;
}
for( long i=0; i<face_collection->GetCount(); ++i ) { // Проход по всем граням коллекции
// 05. Получаем грань из коллекции и переводим ее в тип IModelObject
ksFaceDefinitionPtr face_definition = face_collection->GetByIndex( i ); // Получить определитель i-й грани
if ( ! face_definition ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс face_definition не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}
ksSurfacePtr surface = face_definition->GetSurface();
if ( ! surface ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс surface не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}
IModelObjectPtr face_model_object( IUnknownPtr( ksTransferInterface( surface, ksAPI7Dual, 0), false) );
if ( ! face_model_object ) {
MessageBox(NULL, _bstr_t( _T( "*** face_model_object не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}
// 06. Создаем новую поверхность по сети точек
IMeshPointsSurfacePtr mesh_points_surface( mesh_points_surfaces->Add() );
if ( ! mesh_points_surface ) {
MessageBox(NULL, _bstr_t( _T( "*** mesh_points_surface не получен. Продолжение." ) ), title_dialog, MB_OK); continue;
}
// 07. Инициализируем поверхность по сети точек гранью face_model_object (получена на шаге 05)
if(!(mesh_points_surface->InitParamByFace( face_model_object ) ) ) {
MessageBox(NULL, _bstr_t( _T( "*** mesh_points_surface->InitParamByFace не отработал. Продолжение." ) ), title_dialog, MB_OK); continue;
}
mesh_points_surface->Update();
}
MessageBox(NULL, _bstr_t( _T("Поверхности граней документа получены.") ), title_dialog, MB_OK);
return;
}
Табличное задание для параметров модели
В таблице три колонки
Наименование
Значение
Управляющие (Построение и выход)
Исходная информация готовится в Excel и записывается на диск "С:\" в формате с разделителем табуляция.
На новой детали включаем макрос, появляется таблица с исходными данными, можно изменить и на выполнение.
В первой колонке файла записано имя программы для которой предназначены данные.
Имя выполняемой программы также записано в переменную и можно выбрать из файла свои данные, типа базы данных для всех программ.
Из опыта применения в качестве аналога, кода записанного в графическом режиме.
При селектировании поверхностей нужна чистая точка без конфликтов и легче работать с плоскостью на которой расположена поверхность, например для формирования эскиза.
В этом примере применена плоскость плоскость XY для построения эскизов.
Предлагаю Вашему вниманию фрагмент кода для программного выбора и удаления компонент из текущей сборки.
Комментарии - в коде:
//-------------------------------------------------------------------------------
// Выбрать компоненту для удаления, и удалить
//
// Фунцкия находит в текущей сборке вставленные компоненты, показывает их пользователю,
// и предлагает удалить одну из них по введенному порядковому номеру.
// ---
void ChooseComponent() {
CString title_dialog; title_dialog.Format( _T( "Функция %s" ), _T( "ChooseComponent" ) ); // Заголовок окна сообщений функции
CString tmpstr; // Строка для временных сообщений
ksDocument3DPtr document_3D = MyKompasObject->ActiveDocument3D(); // MyKompasObject - то же самое, что KompasObject в примерах
if ( !document_3D ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс document_3D не получен. Выход.") ), title_dialog, MB_OK); return;
}
IKompasDocument3DPtr doc3D( IUnknownPtr( ksTransferInterface( document_3D, ksAPI7Dual, 0), false) );
if ( !doc3D ) {
MessageBox(NULL, _bstr_t( _T("*** интерфейс doc3D не получен. Выход.") ), title_dialog, MB_OK); return;
}
IPart7Ptr topPart7 = doc3D->TopPart;
if ( !topPart7 ) {
MessageBox(NULL, _bstr_t( _T( "*** интерфейс IPart7Ptr не получен. Выход." ) ), title_dialog, MB_OK); return;
}
// Выйти на вставленные компоненты
_variant_t uniqueParts( topPart7->PartsEx[ ( long )ksAllParts ] ); // Получить массив вставленных деталей и компонент на корневом уровне сборки
if ( ! ( uniqueParts.vt == ( VT_ARRAY | VT_DISPATCH ) ) ) return;
int count = uniqueParts.parray->rgsabound[0].cElements - uniqueParts.parray->rgsabound[0].lLbound;
if ( uniqueParts.parray->cDims != 1 ) return;
LPDISPATCH HUGEP *pvar;
HRESULT hr = ::SafeArrayAccessData( uniqueParts.parray, ( void HUGEP* FAR*)&pvar);
if ( ! ( !FAILED( hr ) && pvar ) ) return;
// Сосчитать компоненты и сформировать их список в строке
long count_components = 0; // кол-во компонент
for ( int i = 0; i < count; i++ ) {
IPart7Ptr obj( pvar[i] );
if ( !( obj ) ) continue;
if( obj->GetDetail() ) continue; // простые детали пропускаем
tmpstr.Format( _T("%ld "), i+1 );
components_str = components_str + tmpstr; // сохраняем название компоненты в строке
++count_components; // подсчитываем кол-во компонент
}
// Проверить, что компоненты в сборке есть
if( count_components == 0 ) {
tmpstr.Format( _T("В данной сборке нет ни одной компоненты. Выход.") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
return;
}
// Сохранить номера компонент в массиве
long *num_components = new long[ count_components ]; // создаем массив для сбора индексов компонент в сборке
long i_c = 0;
for ( int i = 0; i < count; i++ ) {
IPart7Ptr obj( pvar[i] );
if ( !( obj ) ) continue;
if( obj->GetDetail() ) continue;
num_components[ i_c++ ] = i;
}
// Собрать названия компонент в строке и показать ее
CString components_str = _T("В данной сборке есть следующие компоненты:\n\n"); // строка для списка компонент в сборке
for ( int i = 0; i < count_components; ++i ) {
IPart7Ptr obj( pvar[ num_components[ i ] ] );
if ( !( obj ) ) continue;
if( obj->GetDetail() ) continue;
tmpstr.Format( _T("%ld. Компонент %3ld: %s\n"), i+1, num_components[ i ], (LPWSTR)obj->GetName() ); // i+1 - для того чтобы отсчет велся с 1, а не с 0.
components_str = components_str + tmpstr;
}
tmpstr.Format( _T(" Всего: %ld\n\nВыберите компоненту, которую нужно удалить, и в следующем диалоге укажите ее номер (%ld...%ld)."), count_components, 1, count_components );
components_str = components_str + tmpstr;
MessageBox(NULL, components_str, title_dialog, MB_OK); // Выдача диалога со списком компонент
TCHAR bufPromptInsertNumber[255];
LPWSTR PromptInsertNumber; // Строка подсказки в диалоге ввода целого числа
_stprintf_s(bufPromptInsertNumber, _T("Введите номер компоненты (%ld...%ld), которая будет удалена:"), 1, count_components );
PromptInsertNumber = bufPromptInsertNumber;
long choosed_num; // Номер компоненты (порядковый), который будет удален
if( ! MyKompasObject->ksReadInt( PromptInsertNumber, 1, 1, count_components, &choosed_num )) { // Выдача диалога с запросом ввести целое число
tmpstr.Format( _T("*** отказ от ввода"), choosed_num );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
return;
}
IPart7Ptr obj( pvar[ num_components[ choosed_num-1 ] ] ); // Получить IPart7 выбранной копоненты.
// choosed_num-1 - для того чтобы вернуть нумерацию с 0, а не с 1
tmpstr.Format( _T("Введено %ld.\nКомпонента\n%s\nбудет удалена."), choosed_num, (LPWSTR)obj->GetName() );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
// Подготовка к удалению. Получить интерфейс IFeature7 удаляемого IPart7
IFeature7Ptr part7_feature7( IUnknownPtr( ksTransferInterface( obj, ksAPI7Dual, 0 ), false) );
// Так тоже работает:
// const IFeature7Ptr part7_feature7;
// if ( obj->QueryInterface( IID_IFeature7, (void **)&part7_feature7 ) != S_OK || !part7_feature7 ) {
// tmpstr.Format( _T("*** obj->QueryInterface( . . . ) не отработал. Выход") );
// MessageBox(NULL, tmpstr, title_dialog, MB_OK);
// return;
// }
if( part7_feature7 == NULL ) {
tmpstr.Format( _T("*** не удалось получить part7_feature7. Выход") );
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
return;
}
if( ! part7_feature7->Delete() ) {
tmpstr.Format( _T("*** не удалось удалить компоненту № %ld. Выход"),
num_components[ choosed_num-1 ] // choosed_num-1 - для того чтобы вернуть нумерацию с 0, а не с 1
);
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
}
MessageBox(NULL, _T("Гип-гип ура, компонента успешно удалена."), title_dialog, MB_OK);
return;
}
Успехов!
Может есть у кого подробный пример кода что бы с 3д модели сделать развертку и сохранить её как чертеж, мне бы очень помогла для понимания
Добрый день.
Пример макроса на Python во вложении. Запускать на активном чертеже. В чертеже создается вид развертки с детали Electrical appliance box.m3d.
ЦитироватьМожет есть у кого подробный пример кода что бы с 3д модели сделать развертку и сохранить её как чертеж, мне бы очень помогла для понимания
Добрый день, хотел спросить есть ли у кого-либо рабочий код с ComponentPositioner на перемещение?