Создание библиотеки переводников.

Автор niktoto, 17.10.13, 14:25:59

« назад - далее »

0 Пользователи и 3 гостей просматривают эту тему.

niktoto

я видел 2 примера с фантомом:
1) помоему из SDK, там выскакивало окно "вызвать функцию CallBack?", и ничего не менялось в зависимости от выбора вызывать ее или нет.
2) пример из методических материалов http://support.ascon.ru/library/documentation/items/?dl_id=97, который я и взял за основу и там нет функцию CallBack
Дак она обязательна или нет??? Вроде все и без нее работает

Выделите в Компасе какой нибудь элемент и скопируйте, а затем вставьте его и перед завершением вставки поводите мышью, фантом элемента должен за курсором двигаться, если у Вас также, то Вам CallBack функция не нужна.

niktoto

С фантомом вроде бы разобрался, не получается сделать штриховку и симметрию с использованием фантома. Или их нельзя задействовать в фантоме или у меня путаница с закрытием групп? endobj endgroup. Без фантома все работает
Штриховка с использованием замкнутого контура

// Параметры вариантного изображения
  iPhan := ksPhantom(Kompas.GetParamStruct(ko_Phantom));
  iPhan.Init;
  iPhan.phantom := 1;    // Тип варианта - произвольная группа
  // Параметры вывода группы, изображающей вариант
  it1 := ksType1(iPhan.GetPhantomParam);
  it1.Init;
  it1.xBase := 0; it1.yBase := 0; // Базовая точка группы
  it1.scale_ := 1;                // Масштаб
  it1.gr := 0;                    // Дескриптор группы

      // Создание временной группы, изображающей фигуру текущего типа
    it1.gr := Doc.ksNewGroup( 1 );
    // В качестве базовой точки была указана (0,0), поэтому при рисовании
    // варианта именно точка (0, 0) будет совпадать с указателем мыши

    doc.ksMacro(0); /// начался макроэлемент

//Строим прямоугольник, который будем заштриховывать
RectangleParam:=ksRectangleParam(kompas.GetParamStruct(ko_RectangleParam));
RectangleParam.x:=100;
RectangleParam.y:=100;
RectangleParam.ang:=0;
RectangleParam.height:=10;
RectangleParam.width:=10;
RectangleParam.style:=1;
Doc.ksRectangle(RectangleParam, 0);
//Получаем идентификатор контура, который будем заштриховывать
GroupID:=Doc.ksMakeEncloseContours(0,101,101);
//Получаем интерфейс параметров штриховки
HatchParam:=ksHatchParam(kompas.GetParamStruct(ko_HatchParam));
HatchParam.ang := 45;
HatchParam.boundaries := GroupID;
HatchParam.color := $000000; //цвет линий - черный
HatchParam.sheeting:= 0;
HatchParam.step:=1;
HatchParam.style:=0; //металл
HatchParam.width:=0;
HatchParam.x:=101;
HatchParam.y:=101;
//Строим саму штриховку
Doc.ksHatchByParam(HatchParam);

doc.ksEndObj; /// кончился макроэлемент
/// КОНЧАЕТСЯ РИСОВАЛЬНЯ
    Doc.ksEndGroup;

      resCode := Doc.ksPlacement( iReqInfo, x, y, ang, iPhan );

      begin
        // Копирование группы в документ (в текущий вид) с учетом
        // указанного местоположения и угла поворота
        Doc.ksMoveObj( it1.gr, x, y );
        if abs(ang) > 0.01 then
          Doc.ksRotateObj( it1.gr, x, y, ang );
        Doc.ksStoreTmpGroup( it1.gr );
      end;


    end;


end.


ну и тоже самое только в макроэлементе пытаюсь сделать симметрию

//Создаем новую группу объектов
GroupID:=Doc.ksNewGroup(0);
//Создаем объекты новой группы объектов
Doc.ksLineSeg(100, 100, 100, 120,1);
Doc.ksLineSeg(100, 120, 120, 120, 1);
Doc.ksLineSeg(120,120,120,100,1);
Doc.ksLineSeg(120,110,160,110,1);
Doc.ksLineSeg(160,110,160,100,1);
//Завершаем построение новой группы
Doc.ksEndObj();
//Выполняем симметричное отображение созданной группы объектов
Doc.ksSymmetryObj(GroupID,100,100,110,100,'1');


В первом куске кода, я  не нашёл, где Вы используете функцию обратной связи.
В втором замените Doc.ksEndObj(); на Doc.ksEndGroup; Тут Вы создавали группу, а не макроэлемент. 

niktoto

Цитата: Sabahs от 22.11.13, 14:33:32
Выделите в Компасе какой нибудь элемент и скопируйте, а затем вставьте его и перед завершением вставки поводите мышью, фантом элемента должен за курсором двигаться, если у Вас также, то Вам CallBack функция не нужна.
Исходя из проделанного по этой инструкции я понял что функция CallBack не нужна

Тогда зачем Вам эта строка resCode := Doc.ksPlacement( iReqInfo, x, y, ang, iPhan ); и, где Вы заполняете интерфейс параметров запроса к системе iReqInfo?

niktoto

Вот пример который я взял за основу, от себя добавил штриховку в окружность, все равно не хочет строить
procedure Demo_Phantom( iDoc : ksDocument2D );
// Коды фигур
type FigType = set of ( ftCircle, ftTriangle, ftSquare );
var iPhan     : ksPhantom;
    it1       : ksType1;
    iReqInfo  : ksRequestInfo;
    curFig    : FigType;
    fEndCycle : Boolean;
    x, y, ang : Double;
    resCode   : Longint;
    HatchParam: ksHatchParam;
GroupID: integer;
begin
  // Параметры вариантного изображения
  iPhan := ksPhantom(iKompas.GetParamStruct(ko_Phantom));
  iPhan.Init;
  iPhan.phantom := 1;    // Тип варианта - произвольная группа
  // Параметры вывода группы, изображающей вариант
  it1 := ksType1(iPhan.GetPhantomParam);
  it1.Init;
  it1.xBase := 0; it1.yBase := 0; // Базовая точка группы
  it1.scale_ := 1;                // Масштаб
  it1.gr := 0;                    // Дескриптор группы

  // Параметры командного окна (заголовок и команды)
  iReqInfo := ksRequestInfo(iKompas.GetParamStruct(ko_RequestInfo));
  iReqInfo.Init;
  iReqInfo.title := 'Выбор фигуры';
  iReqInfo.commandsString := '!Окружность !Треугольник !Квадрат';

  // Код текущей фигуры
  curFig := [ftCircle];

  fEndCycle := False;
  while not fEndCycle do
  begin
    // Создание временной группы, изображающей фигуру текущего типа
    it1.gr := iDoc.ksNewGroup( 1 );
    // В качестве базовой точки была указана (0,0), поэтому при рисовании
    // варианта именно точка (0, 0) будет совпадать с указателем мыши
    if curFig=[ftCircle] then
    begin
      iDoc.ksCircle( 0, 0, 20, 1 );
      /// Штриховка
      GroupID:=iDoc.ksMakeEncloseContours(0,0,0);
//Получаем интерфейс параметров штриховки
HatchParam:=ksHatchParam(ikompas.GetParamStruct(ko_HatchParam));
HatchParam.ang := 45;
HatchParam.boundaries := GroupID;
HatchParam.color := $000000; //цвет линий - черный
HatchParam.sheeting:= 0;
HatchParam.step:=1;
HatchParam.style:=0; //металл
HatchParam.width:=0;
//Строим саму штриховку
iDoc.ksHatchByParam(HatchParam);
    end
    else if curFig=[ftTriangle] then
    begin
      iDoc.ksLineSeg( -10, 0,  10,  0,  1 );
      iDoc.ksLineSeg( 10,  0,  0,   20, 1 );
      iDoc.ksLineSeg( 0,   20, -10, 0,  1 );
    end
    else if curFig=[ftSquare] then
    begin
      iDoc.ksLineSeg( -10, 0,  10,  0,  1 );
      iDoc.ksLineSeg( 10,  0,  10,  20, 1 );
      iDoc.ksLineSeg( 10,  20, -10, 20, 1 );
      iDoc.ksLineSeg( -10, 20, -10, 0,  1 );
    end;
    iDoc.ksEndGroup;

    // Для окружности запрашиваются только координаты центра,
    // для остальных фигур - еще и угол
    if curFig = [ftCircle] then
      resCode := iDoc.ksCursor( iReqInfo, x, y, iPhan )
    else
      resCode := iDoc.ksPlacement( iReqInfo, x, y, ang, iPhan );

    // Обработка результата интерактивного запроса
    case resCode of
      // Выполнение команды отменено
      0 : fEndCycle := True;

      // Была выбрана команда из командного окна
      1 : curFig := [ftCircle];
      2 : curFig := [ftTriangle];
      3 : curFig := [ftSquare];

      // Пользователь успешно выполнил запрос
      -1 :
      begin
        // Копирование группы в документ (в текущий вид) с учетом
        // указанного местоположения и угла поворота
        iDoc.ksMoveObj( it1.gr, x, y );
        if abs(ang) > 0.01 then
          iDoc.ksRotateObj( it1.gr, x, y, ang );
        iDoc.ksStoreTmpGroup( it1.gr );
      end;
    end;

    // Очистка и удаление группы
    iDoc.ksClearGroup( it1.gr, True );
    iDoc.ksDeleteObj( it1.gr );
  end;
end;

Указатель на границу штриховки можно получить так GroupID:=iDoc.ksCircle( 0, 0, 20, 1 );
У Вас временная группа и поэтому в этой строке GroupID:=iDoc.ksMakeEncloseContours(0,0,0); функция вернёт ноль.

niktoto

аааа точно группа то временная! Спасибо поправил, все получилось! Теперь не могу с макроэлементом разобраться. Без макроэлемента рисует все норм - треугольник + штриховка. С макроэлементом - объединяет три линии в макро но без штриховки
    // Создание временной группы, изображающей фигуру текущего типа
    it1.gr := iDoc.ksNewGroup( 1 );
    // В качестве базовой точки была указана (0,0), поэтому при рисовании
    // варианта именно точка (0, 0) будет совпадать с указателем мыши
    if curFig=[ftCircle] then
      iDoc.ksCircle( 0, 0, 20, 1 )
    else if curFig=[ftTriangle] then
    begin
      idoc.ksMacro(it1.gr);
      iDoc.ksLineSeg( -10, 0,  10,  0,  1 );
      iDoc.ksLineSeg( 10,  0,  0,   20, 1 );
      iDoc.ksLineSeg( 0,   20, -10, 0,  1 );
      GroupID:=iDoc.ksMakeEncloseContours(it1.gr,0,0);
//Получаем интерфейс параметров штриховки
HatchParam:=ksHatchParam(ikompas.GetParamStruct(ko_HatchParam));
HatchParam.ang := 45;
HatchParam.boundaries := GroupID;
HatchParam.color := $000000; //цвет линий - черный
HatchParam.sheeting:= 0;
HatchParam.step:=1;
HatchParam.style:=0; //металл
HatchParam.width:=0;
HatchParam.x:=101;
HatchParam.y:=101;
//Строим саму штриховку
iDoc.ksHatchByParam(HatchParam);
    idoc.ksEndObj;
    end

Те же, грабли.
GroupID:=iDoc.ksMakeEncloseContours(it1.gr,0,0); - группа ещё не создана.

niktoto

максимум что получилось это вот
   it1.gr := iDoc.ksNewGroup( 1 );
     idoc.ksMacro(1);
       if curFig=[ftCircle] then
      iDoc.ksCircle( 0, 0, 20, 1 )
    else if curFig=[ftTriangle] then
    begin
      iDoc.ksLineSeg( -10, 0,  10,  0,  1 );
      iDoc.ksLineSeg( 10,  0,  0,   20, 1 );
      iDoc.ksLineSeg( 0,   20, -10, 0,  1 );
        end
    else if curFig=[ftSquare] then
    begin
      iDoc.ksLineSeg( -10, 0,  10,  0,  1 );
      iDoc.ksLineSeg( 10,  0,  10,  20, 1 );
      iDoc.ksLineSeg( 10,  20, -10, 20, 1 );
      iDoc.ksLineSeg( -10, 20, -10, 0,  1 );
    end;
     idoc.ksEndObj;
  GroupID:=iDoc.ksMakeEncloseContours(it1.gr,5,5);
HatchParam:=ksHatchParam(ikompas.GetParamStruct(ko_HatchParam));
HatchParam.ang := 45;
HatchParam.boundaries := GroupID;
HatchParam.color := $000000;
HatchParam.sheeting:= 0;
HatchParam.step:=1;
HatchParam.style:=0;
HatchParam.width:=0;
iDoc.ksHatchByParam(HatchParam);
      iDoc.ksEndGroup;

строит штриховку нормально все но добавляет все кроме штриховки в макроэлемент, если поместить ksendobj за штриховкой то вообще не строит ее

Всё правильно idoc.ksEndObj; - завершает создание макроэлемента, ksOpenMacro открываете на редактирование, добавляете штриховку и ksEndObj закрываете редактирование.
Mac:=idoc.ksEndObj;
GroupID:=iDoc.ksMakeEncloseContours(it1.gr,5,5);
iDoc.ksOpenMacro(Mac);
HatchParam:=ksHatchParam(ikompas.GetParamStruct(ko_HatchParam));
HatchParam.ang := 45;
HatchParam.boundaries := GroupID;
HatchParam.color := $000000;
HatchParam.sheeting:= 0;
HatchParam.step:=1;
HatchParam.style:=0;
HatchParam.width:=0;
iDoc.ksHatchByParam(HatchParam);
idoc.ksEndObj;
iDoc.ksEndGroup;
+ Благодарностей: 1

IgorRUtver

А можно поподробнее как имя библиотеки исправить? А то у меня тоже оно криво выводится. С bitvector не очень понял, это свойство ksTextItemFont а что это за "Интерфейс параметров шрифта компоненты строки текста" чет не пойму. Раньше все работало (в компас х32)
f
unction LibraryName: PChar; pascal;
begin
Result := 'Моя библиотека';
end;

А в компас х64 набор левых символов, если имя задавать одним символом, то его выводит корректно, я не очень посвещен в кодировке. Но пробовал имя задавать PChar, но результат тотже.

function LIBRARYNAMEW: PChar; pascal;
begin
  Result := 'Самая простая библиотека (Delphi)';
end;
+ Благодарностей: 1

IgorRUtver

Unicode какойто, надо прочитать) Спасибо все работает)


IgorRUtver


niktoto

Помниться где то я упоминал про вставку фрагмента из файла frw, очень полезная вещь для меня оказалась, только одна проблема - везде нужно таскать этот файл frw. Возможно ли как нибудь прикрепить его к файлу библиотеки? как например через ImageList крепят изображения

niktoto

хорошо с этим разобрался! теперь другой вопрос! вот есть условие если активный документ 2Д или 3Д, а как сделать условие ЕСЛИ АКТИВЕН ФРАГМЕНТ, ЕСЛИ АКТИВЕН ЧЕРТЕЖ, как например в Shaft-2D, у меня похожая ситуация с профилем резьбы, shaft же не дает вставить профиль когда работа идет во фрагменте