Работа со спецификацией

Автор Sergey, 01.09.09, 13:39:55

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

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

Sergey

Кому-нибудь удалось получить текущее состояние свойства "Показывать все объекты" в открытом документе-спецификация или текущее состояние свойства "Показывать объект в таблице" у базового объекта спецификации??

KonstrSerg

В API7 есть ISpecificationDescription::ShowAllObjects
Хотя он не readonly, но изменение значений не дает ни каких результатов, даже после вызова
ISpecificationDescription::Update.


KonstrSerg

В API7 есть свойство "Показывать объект в таблице" ISpecificationBaseObject::Draw


sorockinalex1

Ребята, все примеры Delphi Automation и  все темы в этой ветке, связанные со спецификацией пересмотрел, перепробовал предложенные примеры, ничего не работает! Так и не получыилось создать спецификацию пустую....
так и не понял...

procedure TForm1.btNewFileClick(Sender: TObject);
var
doc    : ksDocument2D;
spcDoc   : ksSpcDocument;
spc      : ksSpecification;
docPar : ksDocumentParam;
spcPar : ksSpcDescrParam;
ShtPar : ksSheetPar;
path: string;
s:PChar;
begin
    doc := ksDocument2D( Kompas.Document2D );
    spcDoc:=ksSpcDocument(Kompas.SpcDocument);

    docPar := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam));
    spcPar :=  ksSpcDescrParam(Kompas.GetParamStruct(ko_SpcDescrParam));
    ShtPar := ksSheetPar( kompas.GetParamStruct(ko_SheetPar));

    docPar.Init;
    spcPar.Init;
    shtpar.Init;

    docPar.type_ := lt_DocSpc;
    spcDoc.ksSetObjParam(spcDoc.reference, docPar , ALLPARAM);
        docPar.type_ := lt_DocSpc;
        spcPar.layoutName:='\\ks-server3\setup\KOMPAS-3D_V9\Sys\GRAPHIC.LYT';
        spcPar.styleId:=14;
        spcDoc.ksSetObjParam(spcDoc.reference, spcPar , ALLPARAM);
        spcDoc.ksCreateDocument(docPar);
        spcDoc.ksCreateDocument(spcPar);
        doc.ksCreateDocument(docPar);
        doc.ksCreateDocument(spcPar);
end.

пробовал вообще по-всякому... всё перепробовал - не создаётся и всё, в паре случаев сообщения выдаёт о неактивированности и о том, что не найден lyt...
помогите!
объясните, как вообще структура устроена при создании документов, а то уже неделю разбираюсь и не пойму ничего.... всё запутано... специально путали?

sorockinalex1

Цитироватьprocedure TForm1.Button1Click(Sender: TObject);
var
spcDoc    : ksSpcDocument;
spc       : ksSpecification;
docPar    : ksDocumentParam;
spcPar    : ksSpcDescrParam;

begin
    spcDoc:=ksSpcDocument(Kompas.SpcDocument);

    docPar := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam));
    spcPar :=  ksSpcDescrParam(Kompas.GetParamStruct(ko_SpcDescrParam));

    docPar.Init;
    spcPar.Init;
    docPar.type_ := lt_DocSpc;
    spcPar.layoutName:='\\ks-server3\setup\KOMPAS-3D_V9\Sys\GRAPHIC.LYT';
    spcPar.styleId:=14;
    spcDoc.ksCreateDocument( docPar );
    spcDoc.ksSetObjParam(spcDoc.reference, spcPar , ALLPARAM);
end;
пишет
ЦитироватьНе найден стиль спецификации
, а потом
ЦитироватьДокумент не активизирован или не является чертежом/фрагментом


sorockinalex1

#6
спасибо!
старое сообщение:
{только всё равно не получилось ((((((((((}
исправлено:
я был невнимателен ))) всё работает! большое спасибо!

procedure TForm1.Button1Click(Sender: TObject);
var
spcDoc    : ksSpcDocument;
docPar    : ksDocumentParam;
sheetPar  : kssheetpar;
begin
  //????????????? ????????
  if Kompas.ksIsModuleSpecificationActive=0 then
  Kompas.ksModuleSpecification(true);

  spcDoc:=ksSpcDocument(Kompas.SpcDocument);
  docPar := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam));

  docPar.Init;
  docPar.type_ := 4;
  docPar.regime  :=0;

  sheetPar := kssheetpar(docPar.GetLayoutParam);
  sheetPar.layoutName:= '\\ks-server3\setup\KOMPAS-3D_V9\Sys\GRAPHIC.LYT';
  sheetPar.shtType:=14;
  form1.Caption:=vartostr(spcDoc.ksCreateDocument(docPar));
  spcDoc.ksSaveDocument('c:\3.spw');


вообще непонятно зачем тогда существует spcPar :=  ksSpcDescrParam(Kompas.GetParamStruct(ko_SpcDescrParam))???
Там тоже Layout выбирается для спецификации! И другие параметры... Всё запутано как-то...

sorockinalex1

Можно ещё раз попросить помочь?
Может есть у кого готовый код для создания и заполнения его символами:
1. Базового объекта (Создать базовый объект)
2. Вспомогательного объекта (Создать вспомогательный объект)
3. Раздела (Создать раздел)

sorockinalex1

#8
единственное что нашёл на форуме, и то с ошибками написано:

Strcopy(B, PChar(S));          {B - array of Char, S - вносимая строка }
ksSpcObjectCreate('ecad_gr.lyt', 3, razdel, 0, 0, 0);
ksSpcChangeValue( column, item, Addr(B), STRING_ATTR_TYPE);


исправил:
  s:='erewerwerwerwer';
  //  Strcopy(B, PChar(S));          {B - array of Char, S - ???????? ?????? } конфликт Array и Char
  spec.ksSpcObjectCreate('\\ks-server3\setup\KOMPAS-3D_V9\Sys\GRAPHIC.LYT', 14, 1, 1, 0, 0);
  spec.ksSpcChangeValue( 2, 2, IDispatch(Addr(s)), STRING_ATTR_TYPE);
  spec.ksSpcObjectEnd;

не работает
помогите кодом, пожалуйста, а то неделю буду мучаться и опять ничего не получится..  время уйдёт только

sorockinalex1

procedure TForm1.Button2Click(Sender: TObject);
var
  i:integer;
  spcDoc    : ksSpcDocument;
  spec:ksspecification;
  refspcobj:reference;
  piserparam:ksuserparam;
  pitem:ksltvariant;
  parr:ksdynamicarray;
  ssp:ksSpcStyleParam;
  stsp:ksSpcTuningStyleParam;
  ssname, ccname:string;
begin
  spec:=ksspecification(spcDoc.GetSpecification);
  spec.ksSpcObjectCreate(stringtoolestr('\\ks-server3\setup\KOMPAS-3D_V9\Sys\GRAPHIC.LYT'),1,1,0,0,0);
  piserparam:=ksuserparam(kompas.GetParamStruct(112));
  pitem:=ksltvariant(kompas.GetParamStruct(108));
  parr:=ksdynamicarray(kompas.GetDynamicArray(23));
  piserparam.Init;
  piserparam.SetUserArray(parr);
  pitem.Init;
  ssname:='dsfsdf';
  pitem.strVal:=stringtoolestr(ssname);
  parr.ksAddArrayItem(-1,pitem);
  spec.ksSpcChangeValue(4,1,piserparam,string_attr_type);
  spec.ksSpcVisible(4,2,1);
  spec.ksSpcVisible(5,2,1);
  parr.ksClearArray;
  pitem.Init;
  ssname:='_dsfsdf_';
  pitem.strVal:=stringtoolestr(ccname);
  parr.ksAddArrayItem(-1,pitem);
  spec.ksSpcChangeValue(5,1,piserparam,string_attr_type);
  refspcobj:=spec.ksSpcObjectEnd;
  ssp:=ksSpcStyleParam(kompas.GetParamStruct(104));
  ssp.Init;
  stsp:=ksSpcTuningStyleParam(ssp.GetTuning);
  stsp.geometryDel:=1;
  spec.ksSetTuningSpcStyleParam(-1,ssp);


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

Maxagg

вам для 3d или для 2d?
и еще, если вы используете graphic.lyt, не нужно прописывать до него путь достаточно пустых скобок

sorockinalex1

#11
у нас graphic.lyt лежит в сети, поэтому полный путь и пишу )))

Мне для простой спецификации (меню файл-создать-спецификация)
Спецификацию я создал, нужно теперь создать в ней:
1. Раздел (меню вставка-раздел)
2. Базовый объект (меню вставка-базовый объект)
3. Вспомогательный объект (меню вставка-вспомогательный объект)

В общем, вот что мне нужно реализовать программно:
1. Файл-Создать-Спецификация (сделал)
2. Вставка-раздел-ввод символов в ячейки, форматирование строки (шрифт, наклон, жирность, высота и т.д., выравнивание)
3. Вставка-базовый объект-ввод символов в ячейки, форматирование строки (шрифт, наклон, жирность, высота и т.д., выравнивание)
4. Вставка-вспомогательный объект-ввод символов в ячейки, форматирование строки (шрифт, наклон, жирность, высота и т.д., выравнивание)

sorockinalex1

Ура! сегодня разобрался сам каким-то чудом ))))
procedure TForm1.Button3Click(Sender: TObject);
var
Kompas:KompasObject;
spec_f:ksSpcDocument;
spc_f:ksSpecification;
nrazdela:integer;
begin
nrazdela:=StrToInt(Edit1.Text);
Kompas:=KompasObject(GetActiveOleObject('Kompas.Application.5));
spec_f:=ksSpcDocument(Kompas.SpcActiveDocument);
spc_f:=ksSpecification(spec_f.GetSpecification);
spc_f.ksSpcObjectCreate('Graphic.lyt',1,nrazdela,1,0,0);
//namelib - имя библиотеки стилей спецификации
//styleNumb - номер стиля спецификации в библиотеке
//secNumb - номер раздела (5,10,15,20... можно посмотреть в компасе)
//SubSecNumb - номер подраздела
//Numb -  для базового объекта-тип атрибута, который задан по ключам или 0
//        для вспомогательного объекта-номербазового объекта, к которому прикрепляется вспомогательный, либо 0
//typeObj - тип строки спецификации (0-базовый объект, 1-вспомогательный)
spc_f.ksSetSpcObjectColumnText(1,1,1,'SomeText');
spc_f.ksSpcObjectEnd;
end;


sorockinalex1

Вопрос следующий:
Как получить номера и имена разделов указанного стиля? номера и названия разделов хранятся в самом стиле, вроде...

sorockinalex1

сделал.
вопрос, над которым вчера мучался до 2 ночи, так и не нашёл ничего на форуме:
нужно узнать в указанной спецификации (стиль, номер стиля) количество редактируемых столбцов и названия этих столбцов, чтобы создать StringGrid с таким же количеством столбцов и именованием...

sorockinalex1

Получил количество колонок спецификации таким образом:
spc_f.ksGetSpcStyleParam(SpcLayout,SpcStyleNumber,st,ALLPARAM);
Form1.Edit2.text:=inttostr(spc_f. ksGetSpcTableColumn('',1,0));

но это не то...это количество всех колонок(столбцов) спецификации, а нужно из них узнать количество редактируемых (без значка замка)
посмотреть это можно в настройках. на работе компас немного другой, тут я что-то не доставил. в общем, там окно похоже на это:
формат-настройка спецификации-разделы. далее выбираем нужный раздел и нажимаем чуть ниже "редактировать", в открывшемся окне переходим на вкладку "колонки". Там будет таблица с типами колонок, их текстовыми названиями, а так же значочек редактируема ли колонка или нет.
нужно выцепить именно название колонки и редактируема ли она. момогите пожалуйста! сегодня SDK по спецификациям перерыл - ничего не нашёл...

sorockinalex1

Опа! блин, сегодня на работе интернета не было...
ТОлько что нашёл совместно с форумом: надо использзовать
ksSpcStyleColumnParam
свойства:
columnType
createSum
edit-Признак, указывающий, разрешено ли редактирование колонки в данном разделе
ispoln
linkId
multiplyToCount
nameColumn-Имя колонки.
textDn
typeVal
useForSectionTitle

сейчас попробую ))))))

sorockinalex1

блин, опять та же самая фигня.......  >:( >:( >:( >:( >:( >:( >:(
не понимаю я структуру того как вообще работает этот SDK компасовский!
объясните мне! очень прошу!
например, если считывать свойства формы или любого другого элемента delphi - просто пишете, например Form.Caption...
А тут как?
ColumnStylePars:=ksSpcStyleColumnParam(kompas.GetParamStruct(ko_SpcStyleColumnParam));
Edit1.Text:= IntTostr(ColumnStylePars.edit)

естественно это ничего не даёт. Как указать номер столбца, свойство которого я хочу узнать? Ничего непонятно в этом компасе. Объясните мне!
Было бы хорошо, если бы можно было по-нормальному, как для компонентов делфи, к примеру:
ColumnStylePars.Col[i].edit

Prog2

#18
Вот тут что-то сомнительное... ::)
ColumnStylePars:=ksSpcStyleColumnParam(kompas.GetParamStruct(ko_SpcStyleColumnParam));
Edit1.Text:= IntTostr(ColumnStylePars.edit)

Чего-то не достаёт...

Prog2

Код (Пример из SDK) Выделить

SpcStyleParam par;                                      // параметры стиля СП
   ::memset(&par.layoutName1, 0, sizeof(SpcStyleParam)); // очищаем структуру
   // Получить параметры для стиля спецификации с номером numb из библиотеки nameLib
      ::ksGetSpcStyleParam ("graphic.lyt", // имя библиотеки стилей
                      1, // номер стиля спецификации
                      &par, // структура параметров
                      sizeof (SpcStyleParam), // размер структуры параметров
                      ALLPARAM); // вернуть все параметры стиля спецификации
      ::Message (par.layoutName1); // имя файла библиотеки оформлений для первого листа
      ::Message(par.tuning.predefinedTextFileName); // имя файла предопределённых текстов
      int count = ::GetArrayCount (par.arrColumn); // количество элементов в массиве
      for (int i = 0; i < count; i++) {                 // проходим по массиву стилей колонок СП
       SpcStyleColumnParam param;                       // структура параметров стиля
                                                        //колонки спецификации

       ::GetArrayItem(par.arrColumn, i, &param, sizeof(SpcStyleColumnParam));
                                                       // считываем i-й элемент массива
      }

А когда прочитали i-й элемент, можно "param.edit" делать.
ЗЫ: ну и что, что не Delphi...