Параметрический режим и размеры

Автор urbaraban, 07.12.18, 08:35:07

« предыдущая - следующая »

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

urbaraban

Добрый день.

Некоторое время разрабатываю под компас упрощалку черчения и вот добрался до размеров.

Сейчас после создания объекта (линии или прямоугольника) он сразу образмеривается, однако проблема в том, что мне нужны параметрические размеры, а они встают просто текстом, не смотря на то что режим стоит параметрический.

Судя по логам объекты создаются из ksLDimParam, что параметрический, что нет. Но если я это делаю программно, то он текстовый, а если я это делаю ручками в программе, то нет.

Процедура выглядит так:
           
ksLDimParam DimParam = (ksLDimParam)kompas.GetParamStruct((short)StructType2DEnum.ko_LDimParam);
            if (DimParam == null)
             return;

            ksDimDrawingParam StyleDimParam = (ksDimDrawingParam)DimParam.GetDPar();
            ksLDimSourceParam SetDimPar = (ksLDimSourceParam)DimParam.GetSPar();
            ksDimTextParam TextDimPar = (ksDimTextParam)DimParam.GetTPar();

            if (StyleDimParam == null || SetDimPar == null || TextDimPar == null)
                return;

            StyleDimParam.Init();
            StyleDimParam.textPos = 0;
            StyleDimParam.textBase = 0;
            StyleDimParam.pt1 = 1;
            StyleDimParam.pt2 = 1;
            StyleDimParam.ang = 0;
            StyleDimParam.lenght = 40;

            TextDimPar.Init(false);
            TextDimPar.SetBitFlagValue(ldefin2d._AUTONOMINAL, true);
            TextDimPar.SetBitFlagValue(ldefin2d._PREFIX, true);
            TextDimPar.SetBitFlagValue(ldefin2d._DEVIATION, true);
            TextDimPar.SetBitFlagValue(ldefin2d._UNIT, true);
            TextDimPar.SetBitFlagValue(ldefin2d._SUFFIX, true);
            TextDimPar.sign = 0;

            SetDimPar.Init();
            SetDimPar.x1 = X1;
            SetDimPar.y1 = Y1;
            SetDimPar.x2 = X2;
            SetDimPar.y2 = Y2;
            SetDimPar.dx = -10;
            SetDimPar.dy = -10;
            SetDimPar.basePoint = 1;

            doc5.ksLinDimension(DimParam);

urbaraban

Пришлось повозиться, но ответ для прямых отрезков я нашел:

          ILineSegment obj = (ILineSegment)pDrawObj; //получаем линию
          reference DimRef = SetDim(obj.X1, obj.Y1, obj.X2, obj.Y2); //ставим и получаем референс на размер
          SetPointDim(DimRef, obj.Reference, 0); //Устанавливаем связь на точки отрезка и размера
          SetPointDim(DimRef, obj.Reference, 1);

        private void SetPointDim(reference DimRef, reference obj, int Index)
        {
            ksConstraintParam constrParam = (ksConstraintParam)kompas.GetParamStruct((short)StructType2DEnum.ko_ConstraintParam);

            constrParam.Init();
            constrParam.partner = DimRef; //Объект партнер
            constrParam.index = Index; //Индекс точки объекта 0,1,2,3...
            constrParam.partnerIndex = Index; //Индекс точки объекта партнера, к которой мы привязываемся
            constrParam.constrType = (short)ksConstraintTypeEnum.ksCMergePoints; //Тип привязки. В данном случае слияние точек.
            doc5.ksSetObjConstraint(obj, constrParam); //Установки связи
        }



urbaraban

Решение выше не давало нужного эффекта и покопавшись нашел то что нужно. Судя по тому что многие такие темы остались без ответа, этот пост нужен. Наложение ограничений можно сделать одной процедурой, но так нагляднее. Если будете переделывать, то нужно соблюдать порядок как в коде ниже (для API7).

//Референс размера, Объекта и индексы точек на объекте к которым мы установили размер
void SetDim(reference DimRef, reference ObjRef, int Index1, int Index2)
{
  //Получаем объект
  object pDrawObj = (object)appl.KompasAPI.TransferReference(ObjRef, doc.D5.reference);
  //Размер
  object Dim = (object)appl.KompasAPI.TransferReference(DimRef, doc.D5.reference);
  //Интерфейсы ограничений размера. И далее накладывать будем только на него.
  IDrawingObject1 Dim1 = (IDrawingObject1)Dim;

  //Накладываем на объект ограничение совпадение точек 1
  IParametriticConstraint FixPoint1 = Dim1.NewConstraint();
  if (FixPoint1 != null)
  {
    FixPoint1.Comment = "FixPoint1";
    FixPoint1.ConstraintType = ksConstraintTypeEnum.ksCMergePoints; //Совмещаем точки
    FixPoint1.Partner = pDrawObj; //Указатель на объект с которым совмещаем
    FixPoint1.Index = 0; //Номер точки с которой совмещаем
    FixPoint1.PartnerIndex = Index1; //Номер точки объекта партнера
    bool flag = FixPoint1.Create(); //Проверочный флаг. Можно удалить
    }
    //Все тоже самое, но для точки размера номер два. Если у вас квадрат, дуга и пр, то у объекта партнера могут быть индексы 2,3... и т.д
    IParametriticConstraint FixPoint2 = Dim1.NewConstraint();
    if (FixPoint2 != null)
    {
     FixPoint2.Comment = "FixPoint2";
     FixPoint2.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
     FixPoint2.Partner = pDrawObj;
     FixPoint2.Index = 1;
     FixPoint2.PartnerIndex = Index2;
     bool flag = FixPoint2.Create();
    }

    //Накладываем на объект ограничение "Фиксированный размер"
    IParametriticConstraint FixetDim = Dim1.NewConstraint();
    if (FixetDim != null)
    {
      FixetDim.Comment = "FixConstraint";
      FixetDim.ConstraintType = ksConstraintTypeEnum.ksCFixedDim;
      bool flag = FixetDim.Create();
    }


    //Накладываем на объект ограничение "Фиксированный размер"
    IParametriticConstraint WithVariable = Dim1.NewConstraint();
    if (WithVariable != null)
    {
     WithVariable.Comment = "WithVariable";
     WithVariable.ConstraintType = ksConstraintTypeEnum.ksCDimWithVariable;
     bool flag = WithVariable.Create();
    }

}

Последующее изменение размера осуществляется через изменение переменной Variable7. Например так:
void SetSizeToLineDim(object dimension)
{
 IDrawingObject1 Dim1 = (IDrawingObject1)dimension; //Получаем ограничения размера
 Array arrayConstrait = (Array)Dim1.Constraints; //массив ограничений
 //Перебираем ограничения
 foreach (IParametriticConstraint constraint in arrayConstrait)
    //Пока не найдем ограничение с переменной
    if (constraint.ConstraintType == ksConstraintTypeEnum.ksCDimWithVariable)
      //Это не стандартная функция, но суть одна: Мы сообщаем ей имя переменной и значение, вынимая их название из ограничения ksCDimWithVariable
      doc.Variable.Update(constraint.Variable, 9999, string.Empty);
}