Files
SaraP f2abee4c18 Extern :
- C3d aggiornamento delle librerie ( 117967).
2023-11-13 15:27:44 +01:00

389 lines
18 KiB
C++

//////////////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Вспомогательный программный интерфейс решателя.
\en Auxiliary programming interface of the solver. \~
\details
\ru Данный файл содержит устаревшие классы и вызовы. Данное API может оказаться
не удобным, а его методы могут быть удалены или изменены в будущих версиях.
Настоящее взаимодействие с 2D-решателем осуществляется через типы данных и вызовы,
опубликованные в заголовочных файлах gce_api.h, gce_types.h.
\en This file contains deprecrated classes and calls. This API can be inconvenient
and its methods can be deleted or modified in the future versions.
The actual interaction with the 2D-solver is througt the data types and calls
declared in gce_api.h, gce_types.h. \~
*/
//////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GCE_GEOM_H
#define __GCE_GEOM_H
//
#include <math_define.h>
#include <mb_cart_point.h>
#include <pars_tree_variable.h>
//
#include "gce_types.h"
struct IfGeomPoint2d;
//----------------------------------------------------------------------------------------
// \ru Перечисление параметрических объектов \en Enumeration of parametric objects.
//---
enum GcGeomType
{
vt_NULL, ///< \ru Неопределенный тип. \en Undefined type.
gt_Point2d, ///< \ru Точка. \en Point.
gt_Line2d, ///< \ru Прямая. \en Line.
gt_LineSegment2d, ///< \ru Отрезок. \en Segment.
gt_Circle2d, ///< \ru Окружность. \en Circle.
gt_Arc2d, ///< \ru Дуга. \en Arc.
gt_Ellipse2d, ///< \ru Эллипс. \en Ellipse.
gt_EllipseArc2d, ///< \ru Дуга эллипса. \en Ellipse arc.
};
//----------------------------------------------------------------------------------------
// \ru Макросы \en Macros
// ---
#define CAST_PTR(T) IfGeom2dPtr<If ## T,iidr_ ## T> // \ru Указатель с функцией приведения типов \en Pointer with function of type conversion
#define GEOM_PTR(T) IfGeom2dPtr<T,iidr_ ## T> // \ru Указатель с функцией приведения типов \en Pointer with function of type conversion
#define CAST2PTR(T,arg) (arg) != nullptr ? (T*)((arg)->GetInterfacingGeom(iidr_ ## T)) : nullptr // \ru Привести к другому типу \en Convert to another type
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Координата геометрического объекта или переменной \en Coordinate of a geometric object or a variable
//////////////////////////////////////////////////////////////////////////////////////////
struct ItGeomCoord : public ItCoord
{
virtual refcount_t AddRef() const = 0;
virtual refcount_t Release() const = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////
/*
\ru Надкласс примитивных геометрических объектов решателя
Внимание: Применяется только для САПР КОМПАС. Рекомендуется вместо него использовать вызовы API из gce_api.h
объектом IfSomething. Вместо макроса IFPTR применять GEOM_PTR.\n
После того, как MdViewObj будет наконец-то, освобождать память по правилам
IfSomething, нужно:\n
1) Все слова IfSomethingGeom2d заменить на IfSomething;\n
2) Все слова GetInterfacingGeom заменить на QueryInterface;\n
3) Удалить этот класс;\n
4) Компилятор сам подскажет, какие места нужно доправить;\n
\en Used while there is no correct work with MdViewObj in 2D model
as with object IfSomething. GEOM_PTR is to be applied instead of macro IFPTR.\n
After MdViewObj has been implemented it is required to free memory by rules IfSomething,
it is necessary to:\n
1) All words IfSomethingGeom2d replace by IfSomething;\n
2) All words GetInterfacingGeom replace by QueryInterface;\n
3) Delete this class;\n
4) Compiler will prompt which places are to be corrected;\n \~
*/
//////////////////////////////////////////////////////////////////////////////////////////
struct IfSomethingGeom2d
{
virtual IfSomethingGeom2d * GetInterfacingGeom( unsigned int iid ) = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Геометрический объект параметризации \en Geometric object of parametrization
/*\ru Этот тип и его подтипы соответствуют словарю типов решателя, а не типам пользователя.
\en This type and its subtypes correspond to the dictionary of types of the solver but not to the user types. \~
*/
//////////////////////////////////////////////////////////////////////////////////////////
struct IfGeom2d: public IfSomethingGeom2d
{
virtual GcGeomType GetGeomType() const = 0;
/// \ru Выдать обозначение контрольной точки, принадлежащей объекту \en Get notation of the control point belonging to the object
virtual point_type IdentCtrlPoint( const IfGeomPoint2d & ) const = 0;
/// \ru Выдать обозначение координаты, принадлежащей объекту \en Get notation of coordinate belonging to the object
virtual coord_name IdentCoord( const ItGeomCoord & ) const = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Точка на плоскости \en Point on the plane
//////////////////////////////////////////////////////////////////////////////////////////
struct GCE_CLASS IfGeomPoint2d: public IfGeom2d
{
virtual GcGeomType GetGeomType() const { return gt_Point2d; }
virtual ItGeomCoord * GetXCoord() const = 0;
virtual ItGeomCoord * GetYCoord() const = 0;
/// \ru Выдать обозначение контрольной точки, принадлежащей объекту \en Get notation of the control point belonging to the object
virtual coord_name IdentCoord( const ItGeomCoord & ) const;
public:
inline MbCartPoint GetValue() const;
};
//////////////////////////////////////////////////////////////////////////////////////////
// Deprecated (2017). Use GCE_AddLine instead this.
/*
КОМПАС отвязан от этого интерфейса.
*/
//////////////////////////////////////////////////////////////////////////////////////////
struct GCE_CLASS IfGeomLine2d: public IfGeom2d
{
virtual GcGeomType GetGeomType() const { return gt_Line2d; }
virtual ItGeomCoord * GetACoord() = 0; ///< \ru Выдать угол нормали прямой \en Get angle of line normal
virtual ItGeomCoord * GetDCoord() = 0; ///< \ru Выдать расстояние до начала СК в направлении нормали \en Get distance to the coordinate system origin in the normal direction
/// \ru Выдать обозначение контрольной точки, принадлежащей объекту \en Get notation of the control point belonging to the object
virtual coord_name IdentCoord( const ItGeomCoord & ) const;
};
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Отрезок на плоскости \en Segment on the plane
//////////////////////////////////////////////////////////////////////////////////////////
struct GCE_CLASS IfGeomLineSeg2d: public IfGeom2d
{
virtual GcGeomType GetGeomType() const { return gt_LineSegment2d; }
virtual IfGeomPoint2d * GetEnd( int nb ) = 0; ///< \ru Выдать конец отрезка 1,2 \en Get end of segment 1,2
virtual bool IsFixedLength() = 0; ///< \ru Признак отрезка постоянной длины (для стрелки взгляда) \en Flag of segment of constant length (for the view vector)
// \ru Выдать обозначение контрольной точки, принадлежащей объекту \en Get notation of the control point belonging to the object
virtual coord_name IdentCoord( const ItGeomCoord & ) const { return GCE_NULL_CRD; }
inline GCE_point EndPoint( int nb ); ///< \ru Выдать конец отрезка 1,2 \en Get end of segment 1,2
};
//////////////////////////////////////////////////////////////////////////////////////////
// Deprecated (2017). Use GCE_AddCircle instead this.
/*
КОМПАС отвязан от этого интерфейса.
*/
//////////////////////////////////////////////////////////////////////////////////////////
struct GCE_CLASS IfGeomCircle2d: public IfGeom2d
{
virtual GcGeomType GetGeomType() const { return gt_Circle2d; }
virtual IfGeomPoint2d * GetCentre() = 0;
virtual ItGeomCoord * GetRadius() = 0;
// \ru Выдать обозначение контрольной точки, принадлежащей объекту \en Get notation of the control point belonging to the object
virtual coord_name IdentCoord( const ItGeomCoord & ) const;
};
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Эллипс на плоскости \en Ellipse on the plane
//////////////////////////////////////////////////////////////////////////////////////////
struct GCE_CLASS IfGeomEllipse2d: public IfGeom2d
{
virtual GcGeomType GetGeomType() const { return gt_Ellipse2d; }
virtual IfGeomPoint2d * GetCentre() = 0; // \ru Выдать центр эллипса \en Get ellipse center
virtual ItGeomCoord * GetACoord() = 0; // \ru Выдать размер полуоси а \en Get size of semiaxis a
virtual ItGeomCoord * GetBCoord() = 0; // \ru Выдать размер полуоси b \en Get size of semiaxis b
virtual ItGeomCoord * GetPhiCoord() = 0; // \ru Выдать угол оси a \en Get angle of axis a
virtual coord_name IdentCoord( const ItGeomCoord & ) const; // \ru Выдать обозначение контрольной точки, принадлежащей объекту \en Get notation of the control point belonging to the object
virtual bool IsClockwise() const = 0; // \ru Вернет true, усли параметризация эллипса по часовой стрелке. \en Returns true if the ellipse parametrization is directed clockwise.
};
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Дуга эллипса на плоскости \en Elliptical arc on the plane
//////////////////////////////////////////////////////////////////////////////////////////
struct GCE_CLASS IfGeomEllipseArc2d: public IfGeomEllipse2d
{
virtual GcGeomType GetGeomType() const { return gt_EllipseArc2d; }
virtual IfGeomPoint2d * GetEnd( int nb ) = 0;
inline MbCartPoint GetEndValue( int nb )
{
if ( const IfGeomPoint2d * bnd = GetEnd(nb) )
{
return bnd->GetValue();
}
return MbCartPoint();
}
};
//----------------------------------------------------------------------------------------
// \ru Выдать true, если оба указателя представляют одну и ту же точку параметрическую точку \en Return true if both pointers represent the same parametric point
/*\ru Поведение соответствует ParPoint::IsEqual
\en Behavior corresponds to ParPoint::IsEqual \~
*/
//---
inline bool SamePoints( const IfGeomPoint2d * p1, const IfGeomPoint2d * p2 )
{
if ( p2 == p1 )
{
return true;
}
if ( p1 && p2 )
{
if ( p1->GetXCoord() == p2->GetXCoord() )
{
return true;
}
}
return false;
}
//----------------------------------------------------------------------------------------
//
//---
inline MbCartPoint IfGeomPoint2d::GetValue() const
{
MbCartPoint val;
if ( const ItGeomCoord * x = GetXCoord() )
{
if ( const ItGeomCoord * y = GetYCoord() )
{
val.Init( x->GetValue(), y->GetValue() );
}
}
return val;
}
//----------------------------------------------------------------------------------------
//
//---
inline GCE_point IfGeomLineSeg2d::EndPoint( int nb )
{
GCE_point val;
if ( IfGeomPoint2d * pnt = GetEnd(nb) )
{
const MbCartPoint xy = pnt->GetValue();
val.x = xy.x;
val.y = xy.y;
}
return val;
};
//----------------------------------------------------------------------------------------
/// Выдать обозначение контрольной точки, принадлежащей объекту
//---
inline coord_name IfGeomPoint2d::IdentCoord( const ItGeomCoord & crd ) const
{
IfGeomPoint2d * theObject = const_cast<IfGeomPoint2d*>( this );
if ( theObject->GetXCoord() == &crd )
{
return GCE_X;
}
if ( theObject->GetYCoord() == &crd )
{
return GCE_Y;
}
return GCE_NULL_CRD;
}
//----------------------------------------------------------------------------------------
/// Выдать обозначение контрольной точки, принадлежащей объекту
//---
inline coord_name IfGeomLine2d::IdentCoord( const ItGeomCoord & crd ) const
{
IfGeomLine2d * theLine = const_cast<IfGeomLine2d*>( this );
if ( theLine->GetACoord() == &crd )
{
return GCE_ACRD;
}
if ( theLine->GetDCoord() == &crd )
{
return GCE_DCRD;
}
return GCE_NULL_CRD;
}
//----------------------------------------------------------------------------------------
/// Выдать обозначение контрольной точки, принадлежащей объекту
//---
inline coord_name IfGeomCircle2d::IdentCoord( const ItGeomCoord & crd ) const
{
IfGeomCircle2d * theObject = const_cast<IfGeomCircle2d*>( this );
if ( theObject->GetRadius() == &crd )
{
return GCE_RADIUS;
}
if ( const IfGeomPoint2d * pnt = theObject->GetCentre() )
{
return pnt->IdentCoord( crd );
}
return GCE_NULL_CRD;
}
//----------------------------------------------------------------------------------------
/// Выдать обозначение контрольной точки, принадлежащей объекту
//---
inline coord_name IfGeomEllipse2d::IdentCoord( const ItGeomCoord & crd ) const
{
IfGeomEllipse2d * theObject = const_cast<IfGeomEllipse2d*>( this );
if ( theObject->GetACoord() == &crd )
{
return GCE_MAJOR_RADIUS;
}
if ( theObject->GetBCoord() == &crd )
{
return GCE_MINOR_RADIUS;
}
if ( theObject->GetPhiCoord() == &crd )
{
return GCE_ACRD;
}
if ( const IfGeomPoint2d * pnt = theObject->GetCentre() )
{
return pnt->IdentCoord( crd );
}
return GCE_NULL_CRD;
}
//////////////////////////////////////////////////////////////////////////////////////////
// \ru Аналог IfPtr без работы со счетчиком ссылок \en Analog of IfPtr without working with reference counter
/*\ru Указатель с сервисом приведения типов
\en Pointer with type conversion service \~
*/
//////////////////////////////////////////////////////////////////////////////////////////
template <class T, const unsigned int iid>
class IfGeom2dPtr
{
T * m_pI;
public:
IfGeom2dPtr() : m_pI(nullptr) {}
IfGeom2dPtr( T * pI ): m_pI(pI) {}
IfGeom2dPtr( IfSomethingGeom2d * pI ) : m_pI(nullptr) { if ( pI != nullptr ) m_pI = (T*)pI->GetInterfacingGeom(iid); }
IfGeom2dPtr( const IfGeom2dPtr<T,iid> & o ) : m_pI( o.m_pI ) {}
public:
unsigned int GetIid() const { return iid; }
operator T*() const { return m_pI; }
T& operator *() { C3D_ASSERT(m_pI != nullptr); return *m_pI; }
T** operator &() { C3D_ASSERT(m_pI == nullptr); return &m_pI; }
T* operator->() { C3D_ASSERT(m_pI != nullptr); return m_pI; }
T* operator->() const { C3D_ASSERT(m_pI != nullptr); return m_pI; }
T* Get() const { return m_pI; }
T* operator= ( T* pI ) { m_pI = pI; }
T* operator= ( const IfGeom2dPtr<T,iid> & o ) { return operator=(o.m_pI); }
T* operator= ( IfSomethingGeom2d * pI );
};
//----------------------------------------------------------------------------------------
// \ru Присвоить другой интерфейс \en Assign another interface
// ---
template <class T, const unsigned int iid>
inline T* IfGeom2dPtr<T, iid>::operator = ( IfSomethingGeom2d * pI ) {
T * pOld = m_pI;
m_pI = nullptr;
if ( pI != nullptr )
m_pI = (T*)pI->GetInterfacingGeom( iid );
return m_pI;
}
//----------------------------------------------------------------------------------------
// \ru Идентификаторы интерфейсов решателя сопряжений \en Identifiers of constraint solver interfaces
//---
typedef enum
{
// \ru Геометрические объекты \en Geometrical objects
iidr_IfSomethingGeom2d,
iidr_IfGeom2d, ///< \ru Плоский геометрический объект \en Planar geometric object
iidr_IfGeomPoint2d,
iidr_IfGeomLine2d,
iidr_IfGeomLineSeg2d,
iidr_IfGeomCircle2d,
iidr_IfGeomEllipse2d,
iidr_IfGeomEllipseArc2d,
iidr_ParSolvingObj, ///< \ru Интерфейс неизвестного чертежного объекта, не обязательно примитивного, \en Interface of unknown drawing object, not necessary primitive
} EIfIDRolesMathGC;
#endif
// eof