4329 lines
110 KiB
C++
4329 lines
110 KiB
C++
#include "StdAfx.h"
|
||
#include "GeRectAngle.h"
|
||
#include "AcDbObjectPtr.h"
|
||
#include "globalFunc.h"
|
||
#include "globalDefine.h"
|
||
#include "ADSGePointList.h"
|
||
#include "PickEntSet.h"
|
||
#include "AecDbText.h"
|
||
#include "aecdbdimension.h"
|
||
#include "EntityEdJig.h"
|
||
#include "DimOptionDlg.h"
|
||
#include "DbEquipment.h"
|
||
#include "AecDbRadiusDim.h"
|
||
#include "AecDbSymbSymmetry.h"
|
||
#include "AecDbSymbRupture.h"
|
||
#include "AecDbSymbSection.h"
|
||
#include "AecDbSymbCoord.h"
|
||
#include "AecDbSymbMultiLeader.h"
|
||
#include "AecDbSymbDrawingIndex.h"
|
||
#include "AecDbSymbElevation.h"
|
||
#include "AecDbSymbModi.h"
|
||
#include "AecDbDrawingName.h"
|
||
#include "AecDbSymbIndexPointer.h"
|
||
#include "AecDbSymbComposing.h"
|
||
#include "coretools.h"
|
||
#include "DbPipe.h"
|
||
#include "DimOptionData.h"
|
||
#include "layerdef.h"
|
||
#include "modifydimdlg.h"
|
||
#include "ktcadutility.h"
|
||
|
||
AECDLLIMPEXP bool GetDoubleClickEnt(LPCTSTR pszCmd, AcDbObjectId &id);
|
||
extern AcDbObjectId InitDimStyle(TDimStyle ds);
|
||
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
|
||
extern AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb = NULL);
|
||
extern AcDbObjectId InitTextStyle(const TCHAR *pszStyle, AcDbDatabase *pDb = NULL);
|
||
extern TCHAR* LAY_DIM;
|
||
extern TCHAR* LAY_TEXT;
|
||
|
||
namespace
|
||
{
|
||
int BatchDim(CBatchDimDlg &dlg, ads_matrix mat)
|
||
{
|
||
BOOL bIsWcs = GlobalFunc::IsWCS();
|
||
|
||
while (TRUE)
|
||
{
|
||
PickSet entSet;
|
||
RBList maskList(RTDXF0, _T("LINE,ARC,CIRCLE,LWPOLYLINE,POINT,AEC_BIAOGAOBIAOZHU"), NULL);
|
||
TCHAR szKey[132] = _T("SQ");
|
||
TCHAR key;
|
||
|
||
int nRet = GlobalFunc::SelectEnts(_T("\n请选择需标注坐标的对象或 [设置(S)\\单点标注(Q)]<退出>:"), _T("\n请选择需标注坐标的对象: "),
|
||
maskList, entSet, szKey, key);
|
||
if (nRet == RTKWORD)
|
||
{
|
||
if (key == _T('S') || key == _T('s')) // 设置
|
||
{
|
||
double nNorthAngle = PI / 2;
|
||
PickSet ssNorth(SS_FREE);
|
||
if (ssNorth.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("AEC_ZHIBEIZHEN"), 67, 0, NULL)) == RTNORM) // 模型空间指北针
|
||
{
|
||
Entity ent0 = ssNorth[0L];
|
||
ent0.GetData(50, &nNorthAngle);
|
||
}
|
||
|
||
CCoordDlg dlg(IDD_COORD);
|
||
dlg.m_fAngle = nNorthAngle * 180 / PI;
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (dlg.DoModal() != IDOK)
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
nNorthAngle = dlg.m_fAngle * PI / 180;
|
||
|
||
XPoint().GetRotationMatrix(-nNorthAngle + PI / 2.0, mat);
|
||
|
||
if (CCoordDlg::s_iUnitType == 0)
|
||
{
|
||
g_Option::instance().adsout << _T("\n当前绘图单位:mm;标注单位:M;");
|
||
}
|
||
else
|
||
{
|
||
g_Option::instance().adsout << _T("\n当前绘图单位:M;标注单位:M;");
|
||
}
|
||
|
||
if (CCoordDlg::IsWcsPoint())
|
||
{
|
||
g_Option::instance().adsout << _T("以世界坐标取值;北向角度") << dlg.m_fAngle << _T("度");
|
||
}
|
||
else if (CCoordDlg::IsUcsPoint())
|
||
{
|
||
g_Option::instance().adsout << _T("以用户坐标取值");
|
||
}
|
||
else if (CCoordDlg::IsRedLinePoint())
|
||
{
|
||
g_Option::instance().adsout << _T("以场地坐标取值");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return nRet; // 返回调用处,重新循环
|
||
}
|
||
}
|
||
else if (nRet != RTNORM)
|
||
{
|
||
if (dlg.m_bPost) // 拾取实体
|
||
{
|
||
dlg.SelectEntInDraw();
|
||
dlg.OnClickSelectInDraw();
|
||
continue;
|
||
}
|
||
|
||
return nRet; // 返回调用处,结束命令
|
||
}
|
||
|
||
entSet.Redraw(4); // UnHighLight
|
||
|
||
// 分类存储,减少后续循环和判断的次数
|
||
PickSet plineSet(SS_FREE), lineSet(SS_FREE), arcSet(SS_FREE), circleSet(SS_FREE), ptSet(SS_FREE), elevSet(SS_FREE);
|
||
{
|
||
if (dlg.GetIsAppointLayer()) // 若勾选了图层过滤,只保留指定图层上的对象
|
||
{
|
||
CString strLayerName = dlg.GetStrLayerName();
|
||
strLayerName.Replace(_T("&"), _T(","));
|
||
strLayerName.TrimLeft(_T(","));
|
||
strLayerName.TrimRight(_T(","));
|
||
|
||
RBList rb(RTDXF0, _T("*"), 8, (const TCHAR *)strLayerName, NULL);
|
||
entSet.BaseFilter(rb);
|
||
}
|
||
|
||
plineSet += entSet; // PLINE
|
||
RBList rb(RTDXF0, _T("LWPOLYLINE"), NULL);
|
||
plineSet.BaseFilter(rb);
|
||
entSet -= plineSet;
|
||
|
||
lineSet += entSet; // LINE
|
||
rb = RBList(RTDXF0, _T("LINE"), NULL);
|
||
lineSet.BaseFilter(rb);
|
||
entSet -= lineSet;
|
||
|
||
circleSet += entSet; // CIRCLE
|
||
rb = RBList(RTDXF0, _T("CIRCLE"), NULL);
|
||
circleSet.BaseFilter(rb);
|
||
entSet -= circleSet;
|
||
|
||
arcSet += entSet; // ARC
|
||
rb = RBList(RTDXF0, _T("ARC"), NULL);
|
||
arcSet.BaseFilter(rb);
|
||
entSet -= arcSet;
|
||
|
||
ptSet += entSet; // POINT
|
||
rb = RBList(RTDXF0, _T("POINT"), NULL);
|
||
ptSet.BaseFilter(rb);
|
||
entSet -= ptSet;
|
||
|
||
elevSet = entSet; // 标高标注
|
||
}
|
||
|
||
XPointList lstPts;
|
||
DList<XCurveSegment> listCvSegment;
|
||
{
|
||
if (dlg.GetIsPolyVertex()) // 获得所有多段线的端点
|
||
{
|
||
long lLength = plineSet.Length();
|
||
for (long l = 0; l < lLength; l++)
|
||
{
|
||
XPoly2D poly(plineSet[l]);
|
||
int nPtNums = poly.Length();
|
||
for (int k = 0; k < nPtNums; k++)
|
||
lstPts.NewAppend(poly.GetPointListAt(k)->AsAcGePoint3d());
|
||
}
|
||
}
|
||
|
||
if (dlg.GetIsPoint()) // 获得所有点
|
||
{
|
||
long lLength = ptSet.Length();
|
||
for (long l = 0; l < lLength; l++)
|
||
{
|
||
OPENOBJ_BEGIN(ptSet[l], AcDb::kForRead, AcDbPoint, pPoint);
|
||
if (pPoint != NULL)
|
||
{
|
||
lstPts.NewAppend(pPoint->position());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
if (dlg.GetIsLineVertex()) // 获得所有直线、弧线端点
|
||
{
|
||
long lLength = lineSet.Length(),
|
||
l(0);
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
OPENOBJ_BEGIN(lineSet[l], AcDb::kForRead, AcDbLine, pLine);
|
||
if (pLine != NULL)
|
||
{
|
||
lstPts.NewAppend(pLine->startPoint());
|
||
lstPts.NewAppend(pLine->endPoint());
|
||
listCvSegment.Append(new XCurveSegment(pLine->startPoint(), pLine->endPoint(), 0));
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
lLength = arcSet.Length();
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
XCurveSegment arc(arcSet[l]);
|
||
lstPts.NewAppend(arc.StartPoint());
|
||
lstPts.NewAppend(arc.EndPoint());
|
||
listCvSegment.Append(new XCurveSegment(arc));
|
||
}
|
||
}
|
||
|
||
if (dlg.GetIsElevLoc()) // 获得所有标高符号的插入点
|
||
{
|
||
long lLength = elevSet.Length();
|
||
for (long l = 0; l < lLength; l++)
|
||
{
|
||
OPENOBJ_BEGIN(elevSet[l], AcDb::kForRead, AecXDbSymbElevation, pElevation);
|
||
if (pElevation != NULL)
|
||
{
|
||
lstPts.NewAppend(pElevation->GetLocation());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
if (dlg.GetIsCirclePt()) // 获得所有圆心点
|
||
{
|
||
long lLength = circleSet.Length(),
|
||
l(0);
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
OPENOBJ_BEGIN(circleSet[l], AcDb::kForRead, AcDbCircle, pCircle);
|
||
if (pCircle != NULL)
|
||
{
|
||
lstPts.NewAppend(pCircle->center()); // 圆
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
lLength = arcSet.Length();
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
OPENOBJ_BEGIN(arcSet[l], AcDb::kForRead, AcDbArc, pArc);
|
||
if (pArc != NULL)
|
||
{
|
||
lstPts.NewAppend(pArc->center()); // 弧线
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
lLength = plineSet.Length();
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
XPoly2D poly(plineSet[l]);
|
||
|
||
int nSegNums = poly.TotalSegments();
|
||
for (int k = 0; k < nSegNums; k++)
|
||
{
|
||
XCurveSegment seg;
|
||
poly.Nth(k, seg);
|
||
listCvSegment.Append(new XCurveSegment(seg));
|
||
|
||
if (seg.Is(CURVE_ARC))
|
||
{
|
||
XArc arc = seg.GetArc();
|
||
lstPts.NewAppend(arc.GetCenterPt()); // 多段线中的弧段
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (dlg.GetIsIntersectPt()) // 标注交点
|
||
{
|
||
if (!dlg.GetIsLineVertex()) // 不需要标注直线、弧线端点的时候
|
||
{
|
||
long lLength = lineSet.Length(),
|
||
l(0);
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
OPENOBJ_BEGIN(lineSet[l], AcDb::kForRead, AcDbLine, pLine);
|
||
if (pLine != NULL)
|
||
{
|
||
listCvSegment.Append(new XCurveSegment(pLine->startPoint(), pLine->endPoint(), 0));
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
lLength = arcSet.Length();
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
XCurveSegment arc(arcSet[l]);
|
||
listCvSegment.Append(new XCurveSegment(arc));
|
||
}
|
||
}
|
||
|
||
long lLength = circleSet.Length(),
|
||
l(0);
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
XCurveSegment circle(circleSet[l]);
|
||
listCvSegment.Append(new XCurveSegment(circle));
|
||
}
|
||
|
||
if (!dlg.GetIsCirclePt()) // 不需要标注圆心的时候
|
||
{
|
||
lLength = plineSet.Length();
|
||
for (l = 0; l < lLength; l++)
|
||
{
|
||
XPoly2D poly(plineSet[l]);
|
||
|
||
int nSegNums = poly.TotalSegments();
|
||
for (int k = 0; k < nSegNums; k++)
|
||
{
|
||
XCurveSegment seg;
|
||
poly.Nth(k, seg);
|
||
listCvSegment.Append(new XCurveSegment(seg));
|
||
}
|
||
}
|
||
}
|
||
|
||
int nSegments = listCvSegment.Length();
|
||
for (int m = 0; m < nSegments; m++)
|
||
{
|
||
XCurveSegment segThis = *listCvSegment[m];
|
||
for (int n = m + 1; n < listCvSegment.Length(); n++)
|
||
{
|
||
XCurveSegment segOther = *listCvSegment[n];
|
||
|
||
XPoint ptInter[2];
|
||
int nIntNum = segThis.Intersection(segOther, ptInter[0], ptInter[1]);
|
||
switch (nIntNum)
|
||
{
|
||
case 1:
|
||
lstPts.NewAppend(ptInter[0]);
|
||
break;
|
||
case 2:
|
||
lstPts.NewAppend(ptInter[0]);
|
||
lstPts.NewAppend(ptInter[1]);
|
||
break;
|
||
case 0:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
{
|
||
int nPts = lstPts.Length();
|
||
for (int j = 0; j < nPts; j++)
|
||
{
|
||
XPoint ptDim = *lstPts[j],
|
||
ptValue = ptDim;
|
||
|
||
if (CCoordDlg::IsUcsPoint())
|
||
ptValue = GlobalFunc::Wcs2Ucs(ptValue);
|
||
else if (CCoordDlg::IsWcsPoint())
|
||
ptValue.TransformBy(mat);
|
||
//else if (CCoordDlg::IsRedLinePoint())
|
||
// ptValue = TranslatePtFromRedline(ptValue);
|
||
|
||
double dX(0), dY(0);
|
||
if (CCoordDlg::s_iUnitType == 0) // mm-M
|
||
{
|
||
dX = _AS_METER(ptValue.y);
|
||
dY = _AS_METER(ptValue.x);
|
||
}
|
||
else // M-M
|
||
{
|
||
dX = ptValue.y;
|
||
dY = ptValue.x;
|
||
}
|
||
|
||
if (fabs(dX) < 1E-6)
|
||
dX = 0;
|
||
if (fabs(dY) < 1E-6)
|
||
dY = 0;
|
||
|
||
AecXDbSymbCoord *pCoord = new AecXDbSymbCoord;
|
||
pCoord->SetTextStyleId(InitTextStyle(TS_SYMBOL));
|
||
pCoord->SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
pCoord->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
pCoord->SetAB(g_Option::instance().g_bABCoord);
|
||
pCoord->SetStyle((AecXDbSymbMultiLeader::TArrowStyle)g_Option::instance().g_nCoordArrowStyle);
|
||
pCoord->SetPrecNum(g_Option::instance().g_nCoordPrec);
|
||
if (CCoordDlg::IsUcsPoint())
|
||
pCoord->setColorIndex(4);
|
||
else if (CCoordDlg::IsWcsPoint())
|
||
pCoord->setColorIndex(3);
|
||
//else if (CCoordDlg::IsRedLinePoint())
|
||
// pCoord->setColorIndex(2);
|
||
|
||
pCoord->SetLocation(ptDim);
|
||
pCoord->SetValue(XPoint(dY, dX));
|
||
|
||
ads_polar(ptDim, GlobalFunc::Ucs2Wcs(0.0) + PI / 4, 6 * GlobalFunc::DocGetPScale(), ptDim);
|
||
pCoord->SetTurnPoint(ptDim);
|
||
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, pCoord);
|
||
}
|
||
}
|
||
}
|
||
return RTNORM;
|
||
}
|
||
|
||
BOOL Is2LineIntersection(const GeLine* pLine1, const GeLine* pLine2, ads_point ptrp)
|
||
{
|
||
ADSGePoint3d ptGe;
|
||
AcDbLine line1, line2;
|
||
line1.setStartPoint(pLine1->StartPoint().AsAcGePoint3d());
|
||
line1.setEndPoint(pLine1->EndPoint().AsAcGePoint3d());
|
||
line2.setStartPoint(pLine2->StartPoint().AsAcGePoint3d());
|
||
line2.setEndPoint(pLine2->EndPoint().AsAcGePoint3d());
|
||
|
||
AcDb::Intersect intType;
|
||
if (pLine1->GetLineFlag() == LS_FINITE && pLine2->GetLineFlag() == LS_FINITE) // 都不延长
|
||
intType = AcDb::kOnBothOperands;
|
||
else if (pLine1->GetLineFlag() == LS_FINITE && pLine2->GetLineFlag() == LS_INFINITE)
|
||
intType = AcDb::kExtendThis;
|
||
else if (pLine1->GetLineFlag() == LS_INFINITE && pLine2->GetLineFlag() == LS_FINITE)
|
||
intType = AcDb::kExtendArg;
|
||
else
|
||
intType = AcDb::kExtendBoth;
|
||
|
||
AcGePoint3dArray points;
|
||
Acad::ErrorStatus es = line1.intersectWith(&line2, intType, points);
|
||
if (es != Acad::eOk || points.logicalLength() < 1)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
ptGe = points[0];
|
||
|
||
ptrp[X] = ptGe.x;
|
||
ptrp[Y] = ptGe.y;
|
||
ptrp[Z] = ptGe.z;
|
||
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
void LoadConfig()
|
||
{
|
||
GlobalFunc::LoadConfig();
|
||
}
|
||
|
||
void Option()
|
||
{
|
||
int bOldMeterForSH = g_DimOption::instance().g_bMeterUnitDraw;
|
||
CAcModuleResourceOverride vres;
|
||
CDimOptionDlg dimdlg;
|
||
if (dimdlg.DoModal() == IDOK)
|
||
{
|
||
// 在这里处理一下“绘图单位”,如果“绘图单位”改变,要对系统变量“INSUNITS” 做一致性修改
|
||
LoadConfig();
|
||
if (g_DimOption::instance().g_bMeterUnitDraw != bOldMeterForSH
|
||
&& g_DimOption::instance().g_bMeterUnitDraw != (CoreTools::IsMetersUnit() ? 1 : 0))
|
||
{ // 有变化,且与系统变量不一致
|
||
if (g_DimOption::instance().g_bMeterUnitDraw == 0)
|
||
CKTCadUtility::SetSystemVar(_T("INSUNITS"), AcDb::kUnitsMillimeters);
|
||
else
|
||
CKTCadUtility::SetSystemVar(_T("INSUNITS"), AcDb::kUnitsMeters);
|
||
}
|
||
SHacedCommand(RTSTR, _T("REGEN"), RTNONE);
|
||
if (g_Option::instance().g_bAutoLTScale)
|
||
{
|
||
int nTileMode = 0;
|
||
VERIFY(GlobalFunc::TGGetVar(_T("TILEMODE"), &nTileMode) == RTNORM);
|
||
double ltscale = nTileMode ? g_Option::instance().g_nLtMScale : g_Option::instance().g_nLtPScale;
|
||
GlobalFunc::TGSetVar(_T("LTSCALE"), ltscale);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
void DimRadOrDia(BOOL bDia)
|
||
{
|
||
InitLayer(LAY_DIM, TRUE);
|
||
|
||
EntitySet ent;
|
||
ADSGePoint3d ptPick;
|
||
RBList rb;
|
||
if (GlobalFunc::SelectEntity1(_T("\n请选择待标注的圆弧<退出>: "), ent, ptPick, rb) == RTNORM)
|
||
{
|
||
ptPick = GlobalFunc::Ucs2Wcs(ptPick);
|
||
GeCircle cir;
|
||
if (ent.Is(_T("ARC")) || ent.Is(_T("CIRCLE")))
|
||
{
|
||
cir = GeCircle(ent);
|
||
}
|
||
else
|
||
{
|
||
bool bFoundArc = false;
|
||
AcDbVoidPtrArray subEnt;
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
||
GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt);
|
||
OPENOBJ_END();
|
||
for (long i = 0; i < subEnt.length(); i++)
|
||
{
|
||
AcDbEntity *pEnt = (AcDbEntity*)subEnt[i];
|
||
if (pEnt->isKindOf(AcDbArc::desc()))
|
||
{
|
||
AcDbArc* pArc = AcDbArc::cast(pEnt);
|
||
ads_point c;
|
||
GeArc arc(c, pArc->radius(), pArc->startAngle(), pArc->endAngle());
|
||
|
||
arc.SetCenterPt(pArc->center());
|
||
int flag = arc.HitTest2d(ptPick);
|
||
if (flag > 2)
|
||
{
|
||
bFoundArc = true;
|
||
cir.SetCenterPt(arc.GetCenterPt());
|
||
cir.SetRadius(arc.GetRadius());
|
||
break;
|
||
}
|
||
}
|
||
else if (pEnt->isKindOf(AcDbCircle::desc()))
|
||
{
|
||
AcDbCircle *pCir = AcDbCircle::cast(pEnt);
|
||
cir.SetRadius(pCir->radius());
|
||
cir.SetCenterPt(pCir->center());
|
||
if (cir.HitTest2d(ptPick) > 2)
|
||
{
|
||
bFoundArc = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
GlobalFunc::ReleaseEntSet(subEnt);
|
||
if (!bFoundArc)
|
||
{
|
||
ads_printf(_T("\n请选择弧线!"));
|
||
return;
|
||
}
|
||
}
|
||
|
||
ADSGePoint3d ptOnCir;
|
||
ptPick.Project(&cir, ptOnCir);
|
||
|
||
AecXDbRadiusDim *pDim = new AecXDbRadiusDim;
|
||
// jsx add 160914,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
||
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
pDim->SetStyleId(InitDimStyle(DS_RADIUS));
|
||
pDim->SetDimCenter(cir.GetCenterPt());
|
||
pDim->SetDimEndPoint(ptOnCir);
|
||
if (!bDia) {
|
||
double nDimDist = pDim->GetDimLen(FALSE);
|
||
if (nDimDist > cir.GetCenterPt().Distance2d(ptOnCir))
|
||
pDim->SetDimLen(-nDimDist, FALSE);
|
||
}
|
||
else {
|
||
AecXDbText text;
|
||
pDim->GetDimText(text); // if is default, then it is empty
|
||
TCString sText = pDim->GetText();
|
||
text.SetText(sText);
|
||
ADSGePoint3d ptExt = text.GetExtents();
|
||
if (pDim->GetRadius() < ptExt.x)
|
||
pDim->SetDimLen(-ptExt.x * 1.5, FALSE);
|
||
}
|
||
pDim->SetDiameter(bDia);
|
||
|
||
// modify by xly on 110107 支持图层切换
|
||
//pDim->AddToCSpace(Adesk::kTrue);
|
||
GlobalFunc::AddToSpace<AecXDbEntityBaseEx>(Adesk::kTrue, pDim);
|
||
}
|
||
}
|
||
|
||
void DI_Radius()
|
||
{
|
||
DimRadOrDia(FALSE);
|
||
}
|
||
|
||
void DI_Diameter()
|
||
{
|
||
DimRadOrDia(TRUE);
|
||
}
|
||
|
||
extern void LoadConfig();
|
||
void DI_LoadConfig()
|
||
{
|
||
LoadConfig();
|
||
}
|
||
|
||
extern void Option();
|
||
void DI_Option()
|
||
{
|
||
Option();
|
||
}
|
||
|
||
void DimContinue()
|
||
{
|
||
|
||
//add by lgy 20120507 保存当前空间是模型空间还是图纸空间
|
||
int iTitleMode = 0;
|
||
if (GlobalFunc::TGGetVar(_T("TILEMODE"), &iTitleMode) != RTNORM)//模型空间
|
||
{
|
||
return;
|
||
}
|
||
BOOL b = FALSE;
|
||
InitLayer(LAY_DIM, TRUE);
|
||
AecDbDimension dim;
|
||
ADSGePoint3d ptStart;
|
||
ADSGePointList lstAddPoint; //wcs
|
||
ADSGePointList lstBasePoint;//ucs
|
||
GlobalFunc::PushAcadVar<int> osmode(_T("OSMODE"), GlobalFunc::GetFullOsMode(OS_INT | OS_END));
|
||
|
||
if (GlobalFunc::GetPickPoint(NULL, _T("\n起点"), ptStart) == RTNORM)
|
||
{
|
||
GlobalFunc::PushAcadVar<int> osmode1(_T("OSMODE"), GlobalFunc::GetFullOsMode(OS_PER | OS_INT | OS_END));
|
||
lstBasePoint.Append(new ADSGePoint3d(ptStart));
|
||
ptStart = GlobalFunc::Ucs2Wcs(ptStart);
|
||
|
||
AecDbDimension *pDim = &dim;
|
||
//add by cwk on 060915
|
||
if (pDim->GetSegmentNum() >= 1)
|
||
{
|
||
pDim->RemoveSegment(1);
|
||
}
|
||
|
||
// modify by xly on 110107 支持图层切换
|
||
//pDim->setLayer(LAY_DIM);
|
||
pDim->SetDist2DimLine(6.0);
|
||
pDim->SetLocation(ptStart);
|
||
pDim->AppendSegment(2.0 * g_Option::instance()._DIST_SNAP);
|
||
//modify by lgy 20120507 保存标注样式id,以用来在视口空间中是否需要转换
|
||
//pDim->SetStyleId(InitDimStyle(DS_LINEAR));
|
||
AcDbObjectId idDimStyle = InitDimStyle(DS_LINEAR);
|
||
pDim->SetStyleId(idDimStyle);
|
||
|
||
// sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
||
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
|
||
DimensionEdJig jig(pDim, _T("\n第二点<退出>: "));
|
||
|
||
//add by lgy 20120507 如果当前是图纸空间
|
||
BOOL bExist = FALSE; //如果添加的新的标注样式已经存在,默认不添加不存在
|
||
if (iTitleMode == 0) //当前空间是图纸空间
|
||
{
|
||
PickEntSet entSet;
|
||
entSet.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("VIEWPORT"), NULL));
|
||
|
||
double dScale = 1.0;
|
||
BOOL bOnEnt = FALSE;
|
||
int nNum = GlobalFunc::GetPtOnWhichPort(ptStart, dScale, bOnEnt, entSet); //得到视口编号和视口比例
|
||
|
||
if (nNum > 1 && bOnEnt) //不是最外层的大视口
|
||
{
|
||
jig.m_bInView = TRUE;
|
||
jig.m_entSet = entSet;
|
||
jig.m_nPortNum = nNum;
|
||
jig.m_idDimOld = idDimStyle;
|
||
|
||
//获得原来标注样式在标注样式表中的名字
|
||
CString strName;
|
||
AcDbDimStyleTableRecord *pNewDimStyle = NULL;
|
||
OPENOBJ_BEGIN(idDimStyle, AcDb::kForRead, AcDbDimStyleTableRecord, pDimStyle);
|
||
if (pDimStyle != NULL)
|
||
{
|
||
const TCHAR *pName = NULL;
|
||
pDimStyle->getName(pName);
|
||
strName = pName;
|
||
strName.Format(_T("%s_%.0f"), strName, 1 / dScale);
|
||
pNewDimStyle = (AcDbDimStyleTableRecord*)pDimStyle->clone();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
AcDbDimStyleTable *pDimStyleTbl = NULL;
|
||
Acad::ErrorStatus es = Acad::eOk;
|
||
es = acdbHostApplicationServices()->workingDatabase()->getDimStyleTable(pDimStyleTbl, AcDb::kForWrite);
|
||
if (es != Acad::eOk)
|
||
{
|
||
delete pNewDimStyle;
|
||
pNewDimStyle = NULL;
|
||
return;
|
||
}
|
||
|
||
AcDbObjectId id;
|
||
if (!pDimStyleTbl->has(strName))
|
||
{
|
||
if (pNewDimStyle != NULL)
|
||
{
|
||
pNewDimStyle->setName(strName);
|
||
pNewDimStyle->setDimlfac(1 / dScale);
|
||
|
||
pDimStyleTbl->add(id, pNewDimStyle);
|
||
pDim->SetStyleId(id);
|
||
jig.m_idDimNew = id;
|
||
pNewDimStyle->close();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pNewDimStyle != NULL)
|
||
{
|
||
delete pNewDimStyle;
|
||
pNewDimStyle = NULL;
|
||
}
|
||
pDimStyleTbl->getAt(strName, id);
|
||
pDim->SetStyleId(id);
|
||
jig.m_idDimNew = id;
|
||
bExist = TRUE;
|
||
}
|
||
pDimStyleTbl->close();
|
||
}
|
||
}
|
||
|
||
jig.Step();//add by whl
|
||
jig.m_nFlag = 0;
|
||
jig.doIt();
|
||
//modify by lgy 20120510 逐点标注jig时如果退出了命令需要删除添加的标注样式
|
||
//if(jig.GetRetCode()!=RTNORM)
|
||
// return;
|
||
if (jig.GetRetCode() != RTNORM)
|
||
{
|
||
if (!bExist)
|
||
{
|
||
OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord);
|
||
if (pRecord)
|
||
{
|
||
pRecord->erase();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (!pDim->IsValid())
|
||
{
|
||
g_Option::instance().adsout << _T("请正确点取!");
|
||
return;
|
||
}
|
||
|
||
//add by lgy 20120509 如果标注样式没有考虑视口,需要将之前添加到标注样式表中的
|
||
//标注样式删除掉
|
||
if (!jig.m_bSaveStyle && !bExist)
|
||
{
|
||
OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord);
|
||
if (pRecord)
|
||
{
|
||
pRecord->erase();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
/*
|
||
static int nAnswer=Q_NO;
|
||
nAnswer=YesNoQuestion(_T("\n是否同时作为标注点"), nAnswer);
|
||
if(nAnswer==RTCAN)
|
||
return;
|
||
*/
|
||
ADSGePoint3d ptSec = jig.m_ptDim;
|
||
ADSGePoint3d ptAdd;
|
||
ADSGePoint3d ptBase;
|
||
ptAdd = ptSec;
|
||
lstAddPoint.Append(new ADSGePoint3d(ptAdd));
|
||
ptBase = GlobalFunc::Wcs2Ucs(ptAdd);
|
||
lstBasePoint.Append(new ADSGePoint3d(ptAdd));
|
||
LAB_REINPUT:
|
||
jig.m_pszPrompt = _T("\n请点取尺寸线位置或 [更正尺寸线方向(D)]<退出>: ");
|
||
jig.Step();//add by whl
|
||
jig.m_nFlag = 1;
|
||
jig.m_pszKeyword = _T("D");
|
||
int nKeywordIndex = 0;
|
||
INITGET_BEG(-1, _T("D"));
|
||
jig.doIt();
|
||
INITGET_END();
|
||
int nRetCode = jig.GetRetCode();
|
||
//modify by lgy 20120510
|
||
//if(nRetCode==RTCAN)
|
||
// return;
|
||
if (nRetCode == RTCAN)
|
||
{
|
||
if (!bExist)
|
||
{
|
||
OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord);
|
||
if (pRecord)
|
||
{
|
||
pRecord->erase();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
return;
|
||
}
|
||
|
||
else if (nRetCode == RTKWORD)
|
||
{
|
||
EntitySet entDir;
|
||
double nDirection = 0.0;
|
||
if (entDir.FilterSelect(_T("\n选择墙或线确定尺寸方向<退出>:"),
|
||
//RBList(RTDXF0, _T("LINE,TCH_WALL,TCH_CURTAIN_WALL"), NULL), ADSGePoint3d()) == RTNORM)
|
||
RBList(RTDXF0, _T("LINE"), NULL), ADSGePoint3d()) == RTNORM)
|
||
{
|
||
if (entDir.Is(_T("LINE")))
|
||
{
|
||
GeLine ln(entDir);
|
||
nDirection = ln.Direction();
|
||
}
|
||
else
|
||
{
|
||
//OPENOBJ_BEGIN(entDir, AcDb::kForRead, TDbWall, pWall);
|
||
//if (pWall)
|
||
// nDirection = pWall->GeLine::Direction();
|
||
//OPENOBJ_END();
|
||
}
|
||
}
|
||
else
|
||
return;
|
||
|
||
Vector3D vt = ptSec - ptStart;
|
||
using namespace GlobalFunc;
|
||
double nVal = (vt & Vector3D(cos(nDirection), sin(nDirection)));
|
||
pDim->SetRotation(nDirection);
|
||
pDim->SetSegment(0, nVal);
|
||
goto LAB_REINPUT;
|
||
}
|
||
LAB_RE:
|
||
AcDbObjectId m_id;
|
||
if (pDim->IsValid() && jig.GetRetCode() != RTCAN)
|
||
{
|
||
AecDbDimension *pDimNew = (AecDbDimension *)pDim->clone();
|
||
ASSERT(pDimNew);
|
||
if (g_Option::instance().g_nDimAdjust) pDimNew->AdjustDim(g_Option::instance().g_nDimAdjust != 2);
|
||
|
||
// sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
||
pDimNew->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
|
||
// modify by xly on 110107 支持图层切换
|
||
//m_id = pDimNew->AddToCSpace(Adesk::kTrue);
|
||
m_id = GlobalFunc::AddToSpace<AecXDbCurveBaseEx>(Adesk::kTrue, pDimNew);
|
||
}
|
||
AecDbDimension *pDimTemp;
|
||
acdbOpenObject(pDimTemp, m_id, AcDb::kForRead);
|
||
int nRet;
|
||
TCString szPrompt;
|
||
while (1)
|
||
{
|
||
pDimTemp->getEndPoint(ptBase);
|
||
ptBase = GlobalFunc::Wcs2Ucs(ptBase);
|
||
int nLen = lstAddPoint.Length();
|
||
_stprintf(szPrompt, _T("\n请输入其他标注点或 [撤消上一标注点(U)]<退出>: "));
|
||
|
||
INITGET_BEG(0, _T("U R"));
|
||
nRet = acedGetPoint(ptBase, szPrompt, ptAdd);
|
||
INITGET_END();
|
||
if (nRet == RTNORM)
|
||
{
|
||
ptBase = ptAdd;
|
||
ptAdd = GlobalFunc::Ucs2Wcs(ptAdd);
|
||
if (pDimTemp->upgradeOpen() == Acad::eOk)
|
||
{
|
||
if (!pDimTemp->AddSegment(ptAdd))
|
||
g_Option::instance().adsout << _T("\n点取位置不合适!");
|
||
else
|
||
{
|
||
lstAddPoint.Append(new ADSGePoint3d(ptAdd));
|
||
lstBasePoint.Append(new ADSGePoint3d(ptBase));
|
||
if (g_Option::instance().g_nDimAdjust)//add by whl on 050530
|
||
pDimTemp->AdjustDim(g_Option::instance().g_nDimAdjust != 2);
|
||
}
|
||
|
||
pDimTemp->downgradeOpen();
|
||
}
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
TCString sKey;
|
||
acedGetInput(sKey);
|
||
if (sKey[0] == _T('R'))
|
||
acedGetPoint(NULL, _T("\n参考点:"), ptBase);
|
||
else if (sKey[0] == _T('U'))
|
||
{
|
||
if (pDimTemp->upgradeOpen() == Acad::eOk)
|
||
{
|
||
if (nLen > 0)
|
||
{
|
||
ptAdd = *lstAddPoint.Tail();
|
||
lstAddPoint.Remove(nLen - 1);
|
||
pDimTemp->HitTestOnPoint(ptAdd);
|
||
pDimTemp->FindAndRemoveSegment(ptAdd);
|
||
lstBasePoint.Remove(nLen);
|
||
ptBase = *lstBasePoint.Tail();
|
||
if (g_Option::instance().g_nDimAdjust)//add by whl on 050530
|
||
pDimTemp->AdjustDim(g_Option::instance().g_nDimAdjust != 2);
|
||
|
||
}
|
||
pDimTemp->downgradeOpen();
|
||
}
|
||
}
|
||
if (lstAddPoint.Length() <= 0)
|
||
{
|
||
b = FALSE;
|
||
if (pDimTemp->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pDimTemp->erase();
|
||
}
|
||
jig.m_pszKeyword = NULL;
|
||
BOOL bFirst = TRUE;
|
||
jig.m_nFlag = 3;
|
||
jig.m_pTemp = (AecDbDimension *)pDim->clone();
|
||
jig.Undo(); //add by cwk on 060918
|
||
jig.m_pszKeyword = _T("U");
|
||
jig.m_pszPrompt = _T("\n请输入第二标注点<退出>: ");
|
||
int nRet = jig.doIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
jig.Swap();
|
||
jig.Step();
|
||
ptAdd = jig.m_ptDim;
|
||
lstAddPoint.Append(new ADSGePoint3d(ptAdd));
|
||
ptBase = GlobalFunc::Wcs2Ucs(ptAdd);
|
||
lstBasePoint.Append(new ADSGePoint3d(ptBase));
|
||
if (g_Option::instance().g_nDimAdjust)//add by whl on 050530
|
||
pDimTemp->AdjustDim(g_Option::instance().g_nDimAdjust != 2);
|
||
}
|
||
else
|
||
break;
|
||
goto LAB_RE;
|
||
}
|
||
}
|
||
else if (nRet == RTCAN)
|
||
{
|
||
if (pDimTemp->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pDimTemp->erase();
|
||
pDimTemp->downgradeOpen();
|
||
}
|
||
return;
|
||
}
|
||
else
|
||
break;
|
||
}
|
||
pDimTemp->close();
|
||
}
|
||
}
|
||
|
||
void DimAngle()
|
||
{
|
||
ADSGePoint3d pt1, pt2;
|
||
EntitySet ent1, ent2;
|
||
|
||
RBList rb;
|
||
if (GlobalFunc::SelectEntity1(_T("\n请选择第一条直线<退出>: "), ent1, pt1, rb) != RTNORM)
|
||
return;
|
||
pt1 = GlobalFunc::Ucs2Wcs(pt1);
|
||
GeLine ln1(ent1, LS_INFINITE);
|
||
if (!ent1.Is(_T("LINE")))
|
||
{
|
||
bool bFoundLine = false;
|
||
AcDbVoidPtrArray subEnt;
|
||
OPENOBJ_BEGIN(ent1, AcDb::kForRead, AcDbEntity, pEnt);
|
||
GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt);
|
||
OPENOBJ_END();
|
||
for (long i = 0; i < subEnt.length(); i++)
|
||
{
|
||
AcDbEntity *pEnt = (AcDbEntity*)subEnt[i];
|
||
if (pEnt->isKindOf(AcDbLine::desc()))
|
||
{
|
||
AcDbLine* pLine = AcDbLine::cast(pEnt);
|
||
ln1.StartPoint() = pLine->startPoint();
|
||
ln1.EndPoint() = pLine->endPoint();
|
||
int flag = ln1.HitTest2d(pt1);
|
||
if (flag > 2 && flag < 6)
|
||
{
|
||
bFoundLine = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
GlobalFunc::ReleaseEntSet(subEnt);
|
||
if (!bFoundLine)
|
||
{
|
||
g_Option::instance().adsout << _T("\n请选择直线!");
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (GlobalFunc::SelectEntity1(_T("\n请选择第二条直线<退出>: "), ent2, pt2, rb) != RTNORM)
|
||
return;
|
||
pt2 = GlobalFunc::Ucs2Wcs(pt2);
|
||
GeLine ln2(ent2, LS_INFINITE);
|
||
if (!ent2.Is(_T("LINE")))
|
||
{
|
||
bool bFoundLine = false;
|
||
AcDbVoidPtrArray subEnt;
|
||
OPENOBJ_BEGIN(ent2, AcDb::kForRead, AcDbEntity, pEnt);
|
||
GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt);
|
||
OPENOBJ_END();
|
||
for (long i = 0; i < subEnt.length(); i++)
|
||
{
|
||
AcDbEntity *pEnt = (AcDbEntity*)subEnt[i];
|
||
if (pEnt->isKindOf(AcDbLine::desc()))
|
||
{
|
||
AcDbLine* pLine = AcDbLine::cast(pEnt);
|
||
ln2.StartPoint() = pLine->startPoint();
|
||
ln2.EndPoint() = pLine->endPoint();
|
||
int flag = ln2.HitTest2d(pt2);
|
||
if (flag > 2 && flag < 6)
|
||
{
|
||
bFoundLine = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
GlobalFunc::ReleaseEntSet(subEnt);
|
||
if (!bFoundLine)
|
||
{
|
||
g_Option::instance().adsout << _T("\n请选择直线!");
|
||
return;
|
||
}
|
||
}
|
||
|
||
//add by lxb on 2011/11/24
|
||
//顶点
|
||
ADSGePoint3d ptCen;
|
||
//#ifndef _WIN64
|
||
// if(!ln1.Intersection(&ln2, ptCen))
|
||
//#else
|
||
if (!Is2LineIntersection(&ln1, &ln2, ptCen))
|
||
//#endif
|
||
{
|
||
g_Option::instance().adsout << _T("\n两条线互相平行!");
|
||
return;
|
||
}
|
||
|
||
AecDbDimension *pDim = new AecDbDimension;
|
||
pDim->SetAngular(TRUE);
|
||
pDim->SetDist2DimLine(2.0);
|
||
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0));
|
||
pDim->SetStyleId(InitDimStyle(DS_ANGLE));
|
||
|
||
AcGePoint2d pt01 = pt1.AsAcGePoint2d();
|
||
AcGePoint2d pt02 = pt2.AsAcGePoint2d();
|
||
AcGePoint2d ptCenter = ptCen.AsAcGePoint2d();
|
||
AcGeLine2d line1(ptCenter, pt01);
|
||
AcGeLine2d line2(ptCenter, pt02);
|
||
DimAngleJig jig(pDim, line1, line2, ptCen, const_cast<LPTSTR>(_T("\n请确定尺寸线位置<退出>: ")), NULL);
|
||
if (jig.doIt() != AcEdJig::kNormal)
|
||
{
|
||
delete pDim;
|
||
return;
|
||
}
|
||
|
||
// sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
||
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
|
||
// modify by xly on 110107 支持图层切换
|
||
//pDim->AddToMSpace(TRUE);
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, pDim);
|
||
}
|
||
|
||
void DimArcLen()
|
||
{
|
||
EntitySet ent;
|
||
ADSGePoint3d ptPick;
|
||
int nRetCode = 0;
|
||
GeArc arDim;
|
||
RBList rb;
|
||
for (;;)
|
||
{
|
||
if (GlobalFunc::SelectEntity1(_T("\n请选择要标注的弧段<退出>:"), ent, ptPick, rb) != RTNORM)
|
||
return;
|
||
|
||
ptPick = GlobalFunc::Ucs2Wcs(ptPick);
|
||
if (ent.Is(_T("ARC")))
|
||
{
|
||
arDim = GeArc(ent);
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
bool bFoundArc = false;
|
||
AcDbVoidPtrArray subEnt;
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
||
GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt);
|
||
OPENOBJ_END();
|
||
for (long i = 0; i < subEnt.length(); i++)
|
||
{
|
||
AcDbEntity *pEnt = (AcDbEntity*)subEnt[i];
|
||
if (pEnt->isKindOf(AcDbArc::desc()))
|
||
{
|
||
AcDbArc* pArc = AcDbArc::cast(pEnt);
|
||
arDim.SetCenterPt(pArc->center());
|
||
arDim.SetRadius(pArc->radius());
|
||
arDim.SetStarAngle(pArc->startAngle());
|
||
arDim.SetEndAngle(pArc->endAngle());
|
||
int flag = arDim.HitTest2d(ptPick);
|
||
if (flag > 2)
|
||
{
|
||
bFoundArc = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
GlobalFunc::ReleaseEntSet(subEnt);
|
||
if (!bFoundArc)
|
||
{
|
||
g_Option::instance().adsout << _T("\n请选择弧段!");
|
||
continue;
|
||
}
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 已经取得标注弧
|
||
InitLayer(LAY_DIM, TRUE);
|
||
AecDbDimension dim;
|
||
GeCurveSegment segDim;
|
||
segDim = arDim;
|
||
GlobalFunc::PushAcadVar<int> osmode1(_T("OSMODE"), GlobalFunc::GetFullOsMode(OS_PER | OS_INT | OS_END));
|
||
AecDbDimension *pDim = &dim;
|
||
pDim->m_bInJig = true;
|
||
|
||
// modify by xly on 110107 支持图层切换
|
||
//pDim->setLayer(LAY_DIM);
|
||
pDim->SetStyleId(InitDimStyle(DS_ANGLE));
|
||
pDim->SetDist2DimLine(-6.0);
|
||
ADSGePoint3d ptFix;
|
||
ads_polar(segDim.StartPoint(), segDim.IDirection(0) - PI / 2, 2.0 * GlobalFunc::DocGetPScale(), ptFix);
|
||
pDim->SetLocation(segDim.StartPoint());
|
||
pDim->SetRotation(segDim.IDirection(0));
|
||
pDim->SetAngular(TRUE);
|
||
pDim->SetDimArcLen(TRUE);
|
||
pDim->SetDimChord(FALSE);
|
||
pDim->SetObjRadius(arDim.GetRadius());
|
||
pDim->SetDimRadius(arDim.GetRadius() + 6.0 * GlobalFunc::DocGetPScale());
|
||
GeArc arDimLine = arDim;
|
||
arDimLine.SetRadius(arDimLine.GetRadius() + 6.0 * GlobalFunc::DocGetPScale());
|
||
pDim->AppendSegment(arDimLine.GetLength());
|
||
//((AecDbDimension *)pDim->clone())->AddToCSpace(Adesk::kTrue);
|
||
//return;
|
||
|
||
DimensionEdJig jig(pDim, _T("\n请移动光标位置确定要标注的尺寸类型<退出>: "));
|
||
jig.m_ObjarDim = arDim;
|
||
jig.m_nFlag = 5;
|
||
jig.SetIsArcDim();
|
||
jig.doIt();
|
||
if (jig.m_nRetCode != AcEdJig::kNormal)
|
||
{
|
||
return;
|
||
}
|
||
|
||
jig.m_pszPrompt = _T("\n请指定标注点: ");
|
||
jig.m_nFlag = 1;
|
||
jig.doIt();
|
||
if (jig.m_nRetCode == AcEdJig::kCancel)
|
||
{
|
||
return;
|
||
}
|
||
|
||
BOOL bFirst = TRUE;
|
||
jig.m_nFlag = 4;
|
||
jig.m_pszPrompt = _T("\n请输入其他标注点<退出>: ");
|
||
jig.m_pTemp = (AecDbDimension *)pDim->clone();
|
||
while (jig.doIt() == RTNORM)
|
||
{
|
||
jig.Swap(); //更新pDim
|
||
jig.m_nFlag = 4;
|
||
}
|
||
if (pDim->IsValid() && jig.GetRetCode() != RTCAN)
|
||
{
|
||
AecDbDimension *pDimNew = (AecDbDimension *)pDim->clone();
|
||
ASSERT(pDimNew);
|
||
pDimNew->m_bInJig = false;
|
||
|
||
// sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
||
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
|
||
// modify by xly on 110107 支持图层切换
|
||
//pDimNew->AddToCSpace(Adesk::kTrue);
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, pDimNew);
|
||
}
|
||
}
|
||
|
||
void QuickDim()
|
||
{
|
||
RBList mask(-4, _T("<NOT"), RTDXF0,
|
||
_T("AEC_DANHTEXT,AEC_DUOHTEXT,AEC_CHICUNBIAOZHU,AEC_ZUOBIAOBIAOZHU,AEC_BIAOGAOBIAOZHU,AEC_SUOYINFUHAO,AEC_SUOYINTUMING,AEC_POQIE,AEC_ZHEDUANXIAN,AEC_JIANTOUYINZHU,AEC_YINCHUBIAOZU,AEC_ZUOFABIAOZHU,AEC_DUICHENZHOU,AEC_ZHIBEIZHEN,TEXT,MTEXT,DIMENSION,TABLE,LEADER,")
|
||
, -4, _T("NOT>"), NULL);
|
||
PickEntSet ss(SS_FREE);
|
||
if (GlobalFunc::SelectEntities(_T("\n选择要标注的几何图形:"), ss, mask) != RTNORM)
|
||
return;
|
||
|
||
ADSGePoint3d lowPt, upPt;
|
||
double dAngle = GlobalFunc::Ucs2Wcs(0.0) * 180 / PI;
|
||
ADSGePoint3d ptWcsBase = GlobalFunc::Wcs2Ucs(ADSGePoint3d());
|
||
BOOL bUcs = FALSE;
|
||
if (fabs(dAngle) > 1E-6 || ptWcsBase.Distance2d(ADSGePoint3d()) > 1E-6)
|
||
{
|
||
bUcs = TRUE;
|
||
ADSGePoint3d basePt;
|
||
GlobalFunc::PushAcadVar<int> osmode(_T("OSMODE"), 0);//add by whl on 060223
|
||
|
||
// Zyu modify on 100726,支持64位
|
||
//ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
// RT3DPOINT, &basePt, RTREAL, -dAngle, RTNONE);
|
||
//ads_command(RTSTR, _T(".MOVE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
// RT3DPOINT, &basePt, RT3DPOINT,&ptWcsBase, RTNONE);
|
||
SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &basePt, RTREAL, -dAngle, RTNONE);
|
||
SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &basePt, RT3DPOINT, &ptWcsBase, RTNONE);
|
||
|
||
ss.GetExtend(lowPt, upPt);
|
||
lowPt = GlobalFunc::Ucs2Wcs(lowPt);
|
||
upPt = GlobalFunc::Ucs2Wcs(upPt);
|
||
|
||
// Zyu modify on 100726,支持64位
|
||
//ads_command(RTSTR, _T(".MOVE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
// RT3DPOINT, &ptWcsBase, RT3DPOINT,&basePt, RTNONE);
|
||
//ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
// RT3DPOINT, &basePt, RTREAL, dAngle, RTNONE);
|
||
SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &ptWcsBase, RT3DPOINT, &basePt, RTNONE);
|
||
SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &basePt, RTREAL, dAngle, RTNONE);
|
||
}
|
||
else
|
||
ss.GetExtend(lowPt, upPt);
|
||
|
||
long i, j;
|
||
AcGePoint3dArray dimPoints;
|
||
RBList rb(RTDXF0, _T("LINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE"), NULL);
|
||
ss.BaseFilter(rb);
|
||
for (i = 0; i < ss.Length(); i++)
|
||
{
|
||
EntitySet ent = ss[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
|
||
if (pEnt == NULL)
|
||
continue;
|
||
AcGePoint3dArray stretchPoints;
|
||
pEnt->getStretchPoints(stretchPoints);
|
||
dimPoints.append(stretchPoints);
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
AcGePoint3d ptBack, ptFront;
|
||
long lCount = dimPoints.length();
|
||
for (i = lCount - 1; i > 0; i--)
|
||
{
|
||
ptBack = dimPoints[i];
|
||
for (j = i - 1; j >= 0; j--)
|
||
{
|
||
ptFront = dimPoints[j];
|
||
double dDist(ptBack.distanceTo(ptFront));
|
||
double dPrec(g_DimOption::instance().g_dFreedomDimPrec);
|
||
|
||
if (g_DimOption::instance().g_bMeterUnitDim)
|
||
{
|
||
dPrec = g_DimOption::instance().g_dFreedomDimPrec * .001;
|
||
dDist *= .001;
|
||
}
|
||
|
||
if (dDist < dPrec)
|
||
{
|
||
dimPoints.removeAt(i);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
static int s_iFlag = 2;
|
||
InitLayer(LAY_DIM, TRUE);
|
||
QuickDimensionJig jig;
|
||
jig.SetKeyword(_T("T C A"));
|
||
TCString szState;
|
||
while (1)
|
||
{
|
||
jig.SetDimType(s_iFlag);
|
||
jig.SetExtents(lowPt, upPt);
|
||
jig.SetMidPoints(dimPoints);
|
||
if (s_iFlag == 0)
|
||
szState = _T("整体");
|
||
else if (s_iFlag == 1)
|
||
szState = _T("连续");
|
||
else
|
||
szState = _T("连续加整体");
|
||
|
||
jig.setDispPrompt(_T("\n请指定尺寸线位置(当前标注方式:%s)或 [整体(T)/连续(C)/连续加整体(A)]<退出>:"), szState);
|
||
int nRet;
|
||
INITGET_BEG(-1, _T("T C A"));
|
||
nRet = jig.doIt();
|
||
INITGET_END();
|
||
if (nRet == RTNORM)
|
||
{
|
||
jig.AddToDataBase();
|
||
break;
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
#if ARX > 25
|
||
AcString ss;
|
||
jig.acquireString(ss);
|
||
if (_tcscmp(ss, _T("T")) == 0)
|
||
s_iFlag = 0;
|
||
else if (_tcscmp(ss, _T("C")) == 0)
|
||
s_iFlag = 1;
|
||
else
|
||
s_iFlag = 2;
|
||
#else
|
||
TCHAR sKey[2049];
|
||
jig.acquireString(sKey);
|
||
if (_tcscmp(sKey, _T("T")) == 0)
|
||
s_iFlag = 0;
|
||
else if (_tcscmp(sKey, _T("C")) == 0)
|
||
s_iFlag = 1;
|
||
else
|
||
s_iFlag = 2;
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
if (jig.m_dimbEntity.m_pDrawEnt != NULL)
|
||
delete jig.m_dimbEntity.m_pDrawEnt;
|
||
break;
|
||
}
|
||
}
|
||
|
||
//add by whl on 060223
|
||
if (bUcs)
|
||
SHacedCommand(RTSTR, _T(""), RTSTR, _T(""), RTNONE);
|
||
}
|
||
|
||
void SymbNorthThumb()
|
||
{
|
||
acDocManager->disableDocumentActivation();
|
||
AecXDbSymbNorthThumb ent;
|
||
ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
NorthThumbEdJig jig(&ent);
|
||
jig.SetPrompt(_T("\n指北针位置<退出>:"));
|
||
jig.SetOperCode(NorthThumbEdJig::kCenter);
|
||
if (jig.DoIt() != RTNORM)
|
||
{
|
||
acDocManager->enableDocumentActivation();
|
||
return;
|
||
}
|
||
jig.SetPrompt(_T("\n指北针方向<90.0>:"));
|
||
jig.SetOperCode(NorthThumbEdJig::kDirection);
|
||
if (jig.DoIt() == RTNORM) {
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbNorthThumb*)ent.clone());
|
||
}
|
||
acDocManager->enableDocumentActivation();
|
||
}
|
||
|
||
void DBL_AEC_ZHIBEIZHEN(){}
|
||
|
||
void SymbSymmetry()
|
||
{
|
||
XPoint ptStart;
|
||
if (GlobalFunc::GetPickPoint(NULL, _T("\n起点"), ptStart) != RTNORM)
|
||
return;
|
||
ptStart = GlobalFunc::Ucs2Wcs(ptStart);
|
||
AecXDbSymbSymmetry *pEnt = new AecXDbSymbSymmetry;
|
||
pEnt->SetStartPoint(ptStart);
|
||
|
||
SymmetryEdJig jig(pEnt);
|
||
jig.SetPrompt(_T("\n终点<退出>:"));
|
||
if (jig.DoIt() == RTNORM)
|
||
{
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbSymmetry*)pEnt->clone());
|
||
DELETE_PTR(pEnt);
|
||
}
|
||
else
|
||
{
|
||
delete pEnt;
|
||
}
|
||
}
|
||
|
||
void DBL_AEC_DUICHENZHOU() {}
|
||
|
||
void RuptureLine()
|
||
{
|
||
static bool bExt = true;
|
||
XPoint pt1, pt2;
|
||
if (ads_getpoint(NULL, _T("\n点取折断线起点<退出>: "), pt1) != RTNORM)
|
||
return;
|
||
|
||
static int nRupNum = 1;
|
||
int nRetCode;
|
||
LAB_REPEAT:
|
||
g_Option::instance().adsout << _T("\n点取折断线终点或 [折断数目,当前=")
|
||
<< nRupNum << _T("(N)/自动外延,当前=") << (bExt ? _T("开") : _T("关")) << _T("(O)]<退出>: ");
|
||
INITGET_BEG(0, _T("N O"))
|
||
nRetCode = ads_getpoint(pt1, _T(""), pt2);
|
||
INITGET_END();
|
||
if (nRetCode == RTKWORD)
|
||
{
|
||
XString sKeyInp;
|
||
ads_getinput(sKeyInp);
|
||
if (sKeyInp[0] == _T('N'))
|
||
{
|
||
g_Option::instance().adsout << _T("\n折断数目<") << nRupNum << _T(">:");
|
||
ads_initget(RSG_NOZERO | RSG_NONEG, NULL);
|
||
if (ads_getint(_T(""), &nRupNum) == RTCAN)
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
bExt = !bExt;
|
||
}
|
||
goto LAB_REPEAT;
|
||
}
|
||
else if (nRetCode == RTNORM)
|
||
{
|
||
AecXDbSymbRupture *pRupture = new AecXDbSymbRupture;
|
||
pt1 = GlobalFunc::Ucs2Wcs(pt1);
|
||
pt2 = GlobalFunc::Ucs2Wcs(pt2);
|
||
XPoint ptA = pt1,
|
||
ptB = pt2;
|
||
if (bExt)
|
||
{
|
||
// sg add 090512,设置折断线两端伸出连接区间的距离
|
||
// ads_polar(pt1, ads_angle(pt2, pt1), 3.0*DocGetPScale(), ptA);
|
||
// ads_polar(pt2, ads_angle(pt1, pt2), 3.0*DocGetPScale(), ptB);
|
||
double dDist = pt1.Distance(pt2);
|
||
if (dDist > g_DimOption::instance().g_dRuptureLenLimit - g_Option::instance()._DIST_SNAP) // 大于界限值时
|
||
{
|
||
ads_polar(pt1, ads_angle(pt2, pt1), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptA);
|
||
ads_polar(pt2, ads_angle(pt1, pt2), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptB);
|
||
}
|
||
else // 小于界限值时
|
||
{
|
||
ads_polar(pt1, ads_angle(pt2, pt1), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptA);
|
||
ads_polar(pt2, ads_angle(pt1, pt2), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptB);
|
||
}
|
||
}
|
||
pRupture->SetStartPoint(ptA);
|
||
pRupture->SetEndPoint(ptB);
|
||
|
||
pRupture->SetRuptureNum(nRupNum);
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbRupture*)pRupture->clone());
|
||
DELETE_PTR(pRupture);
|
||
}
|
||
}
|
||
|
||
void DBL_AEC_ZHEDUANXIAN() { }
|
||
|
||
void SymbCut()
|
||
{
|
||
XPoint pt0;
|
||
int nRet = 0;
|
||
|
||
|
||
while (nRet != RTNORM && nRet != RTNONE && nRet != RTCAN)
|
||
{
|
||
nRet = ads_getpoint(NULL, _T("\n点取折断线起点<退出>:"), pt0);
|
||
}
|
||
|
||
if (nRet == RTNORM)
|
||
{
|
||
pt0 = GlobalFunc::Ucs2Wcs(pt0);
|
||
|
||
SymbCutJig jig(pt0);
|
||
jig.m_bIsTwo = FALSE; // add by lgy 20120511 设置是否是单折断线还是双折断线
|
||
|
||
int nCode = jig.DoIt();
|
||
|
||
// add by lgy 20120514 保存添加到模型空间中的折断线的ID
|
||
AcDbObjectId idRupture;
|
||
|
||
if (nCode == RTNORM)
|
||
{
|
||
XPoint ptA = jig.pt0; // 初始化默认值的大小
|
||
XPoint ptB = jig.pt1;
|
||
double dDist = ptA.Distance(ptB);
|
||
if (dDist > g_DimOption::instance().g_dRuptureLenLimit - g_Option::instance()._DIST_SNAP) // 大于界限值时
|
||
{
|
||
ads_polar(ptA, ads_angle(ptB, ptA), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptA);
|
||
ads_polar(ptB, ads_angle(ptA, ptB), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptB);
|
||
}
|
||
else // 小于界限值时
|
||
{
|
||
ads_polar(ptA, ads_angle(ptB, ptA), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptA);
|
||
ads_polar(ptB, ads_angle(ptA, ptB), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptB);
|
||
}
|
||
|
||
AecXDbSymbRupture *pRupture = new AecXDbSymbRupture;
|
||
pRupture->SetStartPoint(ptA);
|
||
pRupture->SetEndPoint(ptB);
|
||
|
||
pRupture->SetRuptureNum(jig.m_nRupNum);
|
||
// modify by xly 101110设置打断线的图层设置,支持默认图层和当前图层
|
||
//pRupture->AddToCSpace(Adesk::kTrue);
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, pRupture);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
void SymbSectionArg(BOOL bViewLine)
|
||
{
|
||
XString sName;
|
||
//add by lgy 20120319 9.0需求将剖面剖切,剖面转折正交剖切,剖面非转折正交剖切,断面剖切
|
||
//修改为对话框选取功能
|
||
//int rc=ads_getstring(0, _T("\n请输入剖切编号<1>:"), sName);
|
||
|
||
AcDbObjectId id = InitTextStyle(TS_SECTION);
|
||
AcDbObjectId id1 = InitTextStyle(TS_INDEXSCALE);
|
||
|
||
CSectionDlg dlg;
|
||
{
|
||
CAcModuleResourceOverride vTemp;
|
||
if (!dlg.Create(CSectionDlg::IDD, acedGetAcadFrame()))
|
||
{
|
||
return;
|
||
}
|
||
|
||
dlg.m_bModeless = TRUE;
|
||
}
|
||
acedGetAcadDwgView()->SetFocus();
|
||
dlg.ShowWindow(SW_SHOW);
|
||
|
||
//add by lgy 20120411 添加while循环实现通过对话框切换命令
|
||
while (TRUE)
|
||
{
|
||
sName = dlg.GetSectionNum();
|
||
if (!_tcscmp(sName, _T("")))
|
||
{
|
||
_tcscpy(sName, _T("1"));
|
||
}
|
||
XPoint ptFirst;
|
||
//modify by lgy 20120412 要判断是否应该退出命令
|
||
//if(ads_getpoint(NULL,_T("\n点取第一个剖切点<退出>: "),ptFirst)!=RTNORM)
|
||
// return;
|
||
int iRet = 0;
|
||
iRet = ads_getpoint(NULL, _T("\n点取第一个剖切点<退出>: "), ptFirst);
|
||
if ((iRet == RTCAN && !dlg.GetIsChangeType()) || iRet == RTNONE)
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
dlg.SetIsChangeType(FALSE);
|
||
if (iRet != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
ptFirst = GlobalFunc::Ucs2Wcs(ptFirst);
|
||
XPoly2D poly(0);
|
||
poly.AppendNode(ptFirst);
|
||
poly.AppendNode(ptFirst);
|
||
|
||
AecXDbSymbSection ent;
|
||
ent.m_bInJig = true;
|
||
ent.SetText(sName);
|
||
//ent.SetTextRotation(Ucs2Wcs(0.0));old
|
||
ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));//modified by whl
|
||
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
//ent.setLayer(ent.GetDefaultLayer());
|
||
// sg modify 120106,给“TS_SECTION”独立出来一个文字样式
|
||
// ent.SetTextStyleId(InitTextStyle(TS_LABEL));
|
||
ent.SetTextStyleId(InitTextStyle(TS_SECTION));
|
||
ent.SetTextLayerId(InitLayer(LAY_TEXT, FALSE));
|
||
ent.SetViewLine(bViewLine);
|
||
ent.SetPoly2D(poly);
|
||
|
||
//modify by lgy 20120320 对话框中要判断是点取的是那种方式绘制剖面剖切
|
||
ent.SetTextHeight(dlg.GetNumHeight());
|
||
ent.SetText(dlg.GetSectionNum());
|
||
AcDbObjectId idScaleStyle = InitTextStyle(dlg.GetNumStyle());
|
||
ent.SetTextStyleId(idScaleStyle);
|
||
if (dlg.GetIsShowDrawText())
|
||
{
|
||
if (dlg.GetLocal() == 0) //两端显示
|
||
{
|
||
ent.SetIsHasIndexS(TRUE);
|
||
ent.SetIsHasIndexE(TRUE);
|
||
}
|
||
else if (dlg.GetLocal() == 1)//始端显示
|
||
{
|
||
ent.SetIsHasIndexS(TRUE);
|
||
ent.SetIsHasIndexE(FALSE);
|
||
}
|
||
else if (dlg.GetLocal() == 2)//末端显示
|
||
{
|
||
ent.SetIsHasIndexS(FALSE);
|
||
ent.SetIsHasIndexE(TRUE);
|
||
}
|
||
|
||
if (!dlg.GetDirect())
|
||
{
|
||
ent.SetDimDirection(0); //剖切方向
|
||
}
|
||
else
|
||
{
|
||
ent.SetDimDirection(1); //剖视方向
|
||
}
|
||
|
||
ent.SetDrawingIndex(dlg.GetDrawNum());
|
||
ent.SetIndexHeight(dlg.GetDrawHeight());
|
||
ent.SetIndexStyleId(InitTextStyle(dlg.GetDrawingStyle()));
|
||
}
|
||
else //不显示文字时,默认仍要有文字样式
|
||
{
|
||
ent.SetDrawingIndex(_T("1")); //如果不显示文字,为标注设置默认文字为1
|
||
ent.SetIndexStyleId(id1);
|
||
ent.SetIndexHeight(3.5);
|
||
}
|
||
|
||
int nMode = dlg.GetSectionMode();
|
||
if (nMode == 4)
|
||
{
|
||
ent.SetViewLine(FALSE);
|
||
}
|
||
SectionEdJig jig(&ent);
|
||
jig.SetPrompt(_T("\n点取第二个剖切点<退出>:"));
|
||
jig.SetOperCode(SectionEdJig::kSectPoint);
|
||
//modify by lgy 20120412 判断是否真需要返回
|
||
//if(jig.DoIt()!=RTNORM)
|
||
//return;
|
||
jig.SetJigMode(nMode);
|
||
jig.SetJigDlg(&dlg);
|
||
iRet = jig.DoIt();
|
||
if ((iRet == RTCAN && !dlg.GetIsChangeType()) || iRet == RTNONE)
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
dlg.SetIsChangeType(FALSE);
|
||
if (iRet != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
int nRet;
|
||
//modify by lgy 20120320 对话框中要判断是点取的是那种方式绘制剖面剖切
|
||
//if(bViewLine)
|
||
if (bViewLine && (nMode == 2 || nMode == 3))
|
||
{
|
||
XPushVar<int> orthomode(_T("ORTHOMODE"), 0);
|
||
jig.SetPrompt(_T("\n点取下一个剖切点<结束>:"));
|
||
jig.SetOperCode(SectionEdJig::kSectPointOther);
|
||
while ((nRet = jig.DoIt()) == RTNORM);
|
||
|
||
if (nRet == RTNONE) //by fxj
|
||
{
|
||
if (jig.GetiFlag2() == 0)
|
||
{
|
||
XPoly2D poly;
|
||
ent.GetPoly2D(poly);
|
||
poly.RemoveNode(poly.Length() - 1);
|
||
if (nMode != 3)
|
||
{
|
||
poly.RemoveNode(poly.Length() - 1);
|
||
}
|
||
ent.SetPoly2D(poly);
|
||
}
|
||
}
|
||
else
|
||
//modify by lgy 20120412 判断是否真需要返回
|
||
//return;
|
||
{
|
||
continue;
|
||
}
|
||
|
||
}
|
||
jig.SetPrompt(_T("\n点取剖视方向<当前>:"));
|
||
jig.SetOperCode(SectionEdJig::kViewDirection);
|
||
nRet = jig.DoIt();
|
||
if ((nRet == RTNORM || nRet == RTNONE) && ent.IsValid()) {
|
||
ent.SetTextLocation(0, ent.GetDefaultTextLocation(0));
|
||
ent.SetTextLocation(1, ent.GetDefaultTextLocation(1));
|
||
|
||
// modify by xly on 100915 实体是否设置在默认层
|
||
//((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue);
|
||
ent.m_bInJig = false;
|
||
//ent.setLastPoint(jig.GetPickPoint());
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbSection*)ent.clone());
|
||
}
|
||
}
|
||
}
|
||
|
||
void SymbSection()
|
||
{
|
||
SymbSectionArg(TRUE);
|
||
}
|
||
|
||
void DBL_AEC_POQIE()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_POQIE"), id);
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbSection, pSection);
|
||
if (!pSection) return;
|
||
|
||
CTemporaryResourceOverride vTemp;
|
||
CEditSectionDlg dlg(acedGetAcadFrame());
|
||
|
||
//add by lgy 20120525 将实体参数传给对话框
|
||
dlg.Obj2Dlg(pSection);
|
||
|
||
INT_PTR nResult = dlg.DoModal();
|
||
if (nResult == IDOK)
|
||
{
|
||
if (pSection->upgradeOpen() == Acad::eOk)
|
||
{
|
||
dlg.Dlg2Obj(pSection);
|
||
pSection->downgradeOpen();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pSection->close();
|
||
return;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
void SymbArrow()
|
||
{
|
||
// sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式
|
||
//AcDbObjectId idTextStyle = InitTextStyle(TS_DIM);
|
||
AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL);
|
||
if (!idTextStyle)
|
||
return;
|
||
|
||
CArrowTextDlg dlg(acedGetAcadFrame());
|
||
//modify by lgy 20120206 要求文字样式要有记忆功能
|
||
//dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle);
|
||
if (dlg.m_strFontStyle == _T(""))
|
||
{
|
||
dlg.m_strFontStyle = (const TCHAR *)GlobalFunc::GetSymbolName(idTextStyle);
|
||
}
|
||
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
||
return;
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
AecXDbSymbArrow ent;
|
||
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
//ent.setLayer(ent.GetDefaultLayer());
|
||
|
||
ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
|
||
while (1)
|
||
{
|
||
int nRet;
|
||
XPoint ptStart;
|
||
XPoly2D poly2d;
|
||
INITGET_BEG(0, _T("P R"));
|
||
nRet = ads_getpoint(NULL, _T("\n箭头起点或 [点取图中曲线(P)/点取参考点(R)]<退出>: "), ptStart);
|
||
INITGET_END();
|
||
if (nRet == RTKWORD)
|
||
{
|
||
XString sKeyword;
|
||
VERIFY(ads_getinput(sKeyword) == RTNORM);
|
||
if (sKeyword[0] == _T('R'))
|
||
{
|
||
XPoint ptRef;
|
||
if (ads_getpoint(NULL, _T("\n输入参考点<退出>:"), ptRef) != RTNORM)
|
||
break;
|
||
if (ads_getpoint(ptRef, _T("\n曲线起点<退出>:"), ptStart) != RTNORM)
|
||
break;
|
||
ptStart = GlobalFunc::Ucs2Wcs(ptStart);
|
||
poly2d.InsertNodeAt(0, ptStart);
|
||
}
|
||
else
|
||
{
|
||
int nCode;
|
||
Entity ent;
|
||
RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL);
|
||
while (1)
|
||
{
|
||
nCode = ent.FilterSelect(_T("\n选择一曲线(LINE/ARC/PLINE):"), mask);
|
||
if (nCode != RTNORM)
|
||
break;
|
||
|
||
if (ent.Is(_T("LINE")) || ent.Is(_T("ARC")))
|
||
{
|
||
XCurveSegment cv(ent);
|
||
poly2d.Reset();
|
||
cv.AsPoly2D(poly2d);
|
||
}
|
||
else
|
||
{
|
||
XPoly2D poly(ent);
|
||
if (!!poly)
|
||
poly2d = poly;
|
||
else
|
||
{
|
||
g_Option::instance().adsout << _T("\n无效的选择!");
|
||
continue;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (nCode == RTNORM)
|
||
{
|
||
}
|
||
else if (nCode == RTNONE)
|
||
continue;
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
else if (nRet == RTNORM)
|
||
{
|
||
ptStart = GlobalFunc::Ucs2Wcs(ptStart);
|
||
poly2d.InsertNodeAt(0, ptStart);
|
||
}
|
||
else
|
||
break;
|
||
|
||
poly2d.Reverse();
|
||
ent.SetPoly2D(poly2d);
|
||
ent.SetTextLocation(ent.GetDefaultTextLocation());
|
||
ent.SetText2Location(ent.GetDefaultText2Location()); // sg add 090106
|
||
ent.SetText(_T("")); // add by [1/11/2008 nsh]
|
||
// dlg.Dlg2Obj(&ent); // [12/28/2007 nsh]
|
||
// sg modify 090225,不知道NSH当时为什么删除
|
||
// 恢复的目的是为了解决:首次设置后,无法预览箭头大小、字高等信息
|
||
dlg.Dlg2Obj(&ent);
|
||
dlg.m_bPost = TRUE;
|
||
|
||
ArrowEdJig jig(&ent);
|
||
jig.SetKeyword(_T("` A U"));
|
||
jig.SetOperCode(ArrowEdJig::kLinePoint);
|
||
jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>:"));
|
||
while (1)
|
||
{
|
||
int nKeyIndex;
|
||
int nRet = jig.DoIt(&nKeyIndex);
|
||
if (nRet == RTNORM)
|
||
{
|
||
ent.GetPoly2D(poly2d);
|
||
if (jig.GetOperCode() == ArrowEdJig::kArcPoint)
|
||
{
|
||
ArrowEdJig jig1(&ent);
|
||
jig1.SetOperCode(ArrowEdJig::kArcMidPoint);
|
||
jig1.SetPrompt(_T("\n点取弧上一点或 [输入半径(R)]:"));
|
||
jig1.SetKeyword(_T("` R"));
|
||
int nKeyIdx;
|
||
while (1)
|
||
{
|
||
int nRetCode1 = jig1.DoIt(&nKeyIdx);
|
||
if (nRetCode1 == RTNORM)
|
||
{
|
||
ent.GetPoly2D(poly2d);
|
||
break;
|
||
}
|
||
else if (nRetCode1 == RTKWORD)
|
||
{
|
||
if (nKeyIdx == 0)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
ArrowEdJig jig2(&ent);
|
||
jig2.SetOperCode(ArrowEdJig::kArcRadius);
|
||
jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):"));
|
||
jig2.SetKeyword(_T("`"));
|
||
while (1)
|
||
{
|
||
int nRetCode2 = jig2.DoIt();
|
||
if (nRetCode2 == RTNORM)
|
||
{
|
||
ent.GetPoly2D(poly2d);
|
||
break;
|
||
}
|
||
else if (nRetCode2 == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: "));
|
||
jig.SetOperCode(ArrowEdJig::kLinePoint);
|
||
jig.SetKeyword(_T("` A U"));
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (jig.GetOperCode() == ArrowEdJig::kLinePoint)
|
||
{
|
||
if (nKeyIndex == 0)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else if (nKeyIndex == 1)
|
||
{
|
||
jig.SetOperCode(ArrowEdJig::kArcPoint);
|
||
jig.SetPrompt(_T("\n弧段下一点或 [直段(L)/回退(U)]<结束>: "));
|
||
jig.SetKeyword(_T("` L U"));
|
||
}
|
||
else if (nKeyIndex == 2)
|
||
{
|
||
int nLen = poly2d.Length();
|
||
if (nLen > 1)
|
||
{
|
||
poly2d.Remove(0);
|
||
poly2d.RemoveBugle(0);
|
||
}
|
||
}
|
||
}
|
||
else if (jig.GetOperCode() == ArrowEdJig::kArcPoint)
|
||
{
|
||
if (nKeyIndex == 0)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else if (nKeyIndex == 1)
|
||
{
|
||
jig.SetOperCode(ArrowEdJig::kLinePoint);
|
||
jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: "));
|
||
jig.SetKeyword(_T("` A U"));
|
||
}
|
||
else if (nKeyIndex == 2)
|
||
{
|
||
int nLen = poly2d.Length();
|
||
if (nLen > 1)
|
||
{
|
||
poly2d.Remove(0);
|
||
poly2d.RemoveBugle(0);
|
||
}
|
||
}
|
||
}
|
||
ent.SetPoly2D(poly2d);
|
||
ent.SetTextLocation(ent.GetDefaultTextLocation());
|
||
ent.SetText2Location(ent.GetDefaultText2Location()); // sg add 090106
|
||
}
|
||
else if (nRet == RTNONE)
|
||
{
|
||
ent.SetPoly2D(poly2d);
|
||
ent.SetTextLocation(ent.GetDefaultTextLocation());
|
||
ent.SetText2Location(ent.GetDefaultText2Location()); // sg add 090106
|
||
dlg.Dlg2Obj(&ent);// add by nsh 20071228
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
// modify by xly on 100915 实体是否设置在默认层
|
||
//((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue);
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbWithText*)ent.clone());
|
||
|
||
dlg.AddToRecent();
|
||
if (!dlg.m_bContinue)
|
||
break;
|
||
dlg.m_bPost = FALSE;
|
||
}
|
||
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
}
|
||
|
||
void DBL_AEC_JIANTOUYINZHU()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_JIANTOUYINZHU"), id);
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbArrow, pArrow)
|
||
if (!pArrow) return;
|
||
|
||
CArrowTextDlg dlg(acedGetAcadFrame());
|
||
dlg.Obj2Dlg(pArrow);
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (dlg.DoModal() != IDOK) return;
|
||
}
|
||
|
||
if (pArrow->upgradeOpen() == Acad::eOk)
|
||
{
|
||
dlg.Dlg2Obj(pArrow);
|
||
pArrow->downgradeOpen();
|
||
}
|
||
OPENOBJ_END()
|
||
}
|
||
|
||
void SymbCoord()
|
||
{
|
||
CCoordDlg::s_iUnitType = GlobalFunc::DocGetMeterUnitDraw();
|
||
|
||
double nNorthAngle = PI / 2; // 默认为90度
|
||
PickSet ssNorth(SS_FREE);
|
||
if (ssNorth.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("AEC_ZHIBEIZHEN"), 67, 0, NULL)) == RTNORM) // 模型空间指北针
|
||
{
|
||
Entity ent0 = ssNorth[0L];
|
||
ent0.GetData(50, &nNorthAngle);
|
||
}
|
||
|
||
XPoint ptLoc, ptLastUcs;
|
||
ads_matrix mat;
|
||
XPoint().GetRotationMatrix(-nNorthAngle + PI / 2.0, mat);
|
||
|
||
if (CCoordDlg::s_iUnitType == 0)
|
||
g_Option::instance().adsout << _T("\n当前绘图单位:mm,标注单位:M;");
|
||
else
|
||
g_Option::instance().adsout << _T("\n当前绘图单位:M,标注单位:M;");
|
||
|
||
if (CCoordDlg::IsWcsPoint())
|
||
g_Option::instance().adsout << _T("以世界坐标取值;北向角度") << GlobalFunc::Angle2Str(nNorthAngle * 180 / PI) << _T("度");
|
||
else if (CCoordDlg::IsUcsPoint())
|
||
g_Option::instance().adsout << _T("以用户坐标取值");
|
||
else if (CCoordDlg::IsRedLinePoint())
|
||
g_Option::instance().adsout << _T("以场地坐标取值");
|
||
|
||
bool bFirst = true;
|
||
while (true)
|
||
{
|
||
if (bFirst)
|
||
{
|
||
if (CCoordDlg::m_bFixAngle)
|
||
{
|
||
dAngle = CCoordDlg::m_strAngle;
|
||
}
|
||
|
||
int nRet;
|
||
//modify by lgy 20120330 9.0要求特征点批量标注功能
|
||
//INITGET_BEG(0,_T("S"));
|
||
//nRet=ads_getpoint(NULL, _T("\n请点取标注点或 [设置(S)]<退出>:"),ptLoc);
|
||
//INITGET_END();
|
||
INITGET_BEG(0, _T("S Q"));
|
||
nRet = ads_getpoint(NULL, _T("\n请点取标注点或 [设置(S)\\批量标注(Q)]<退出>:"), ptLoc);
|
||
INITGET_END();
|
||
if (nRet == RTKWORD)
|
||
{
|
||
// modify by lgy 20120330,增加条件判断,是应为9.0中增加了批量标注
|
||
TCHAR szKey[132];
|
||
if (acedGetInput(szKey) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (szKey[0] == _T('S') || szKey[0] == _T('s')) // 设置
|
||
{
|
||
CCoordDlg dlg(IDD_COORD);
|
||
dlg.m_fAngle = nNorthAngle * 180 / PI;
|
||
//add tyj 20160901:添加精度设置,防止指北针设置角度与坐标标注显示的北向角度不一致的问题
|
||
int luprec, auprec;
|
||
VERIFY(xg_getvar(_T("LUPREC"), &luprec) == RTNORM &&
|
||
xg_getvar(_T("AUPREC"), &auprec) == RTNORM);
|
||
if (auprec == 0)//保留整数
|
||
{
|
||
dlg.m_fAngle = int(dlg.m_fAngle + 0.5);
|
||
}
|
||
else
|
||
{
|
||
double dPrecisionCompute = 1.0;//计算精度的辅助变量
|
||
while (auprec != 0)
|
||
{
|
||
dPrecisionCompute = dPrecisionCompute * 10.0;
|
||
auprec--;
|
||
}
|
||
dlg.m_fAngle = int((dlg.m_fAngle + 0.5 / dPrecisionCompute) * dPrecisionCompute) / dPrecisionCompute;
|
||
}
|
||
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (dlg.DoModal() != IDOK)
|
||
continue;
|
||
}
|
||
|
||
nNorthAngle = dlg.m_fAngle * PI / 180;
|
||
XPoint().GetRotationMatrix(-nNorthAngle + PI / 2.0, mat);
|
||
|
||
if (CCoordDlg::s_iUnitType == 0)
|
||
g_Option::instance().adsout << _T("\n当前绘图单位:mm;标注单位:M;");
|
||
else
|
||
g_Option::instance().adsout << _T("\n当前绘图单位:M;标注单位:M;");
|
||
|
||
if (CCoordDlg::IsWcsPoint())
|
||
g_Option::instance().adsout << _T("以世界坐标取值;北向角度") << dlg.m_fAngle << _T("度");
|
||
else if (CCoordDlg::IsUcsPoint())
|
||
g_Option::instance().adsout << _T("以用户坐标取值");
|
||
//else if (CCoordDlg::IsRedLinePoint())
|
||
// g_Option::instance().adsout << _T("以场地坐标取值");
|
||
continue;
|
||
}
|
||
else if (szKey[0] == _T('Q') || szKey[0] == _T('q')) // 批量标注,add by lgy 20120330,9.0新增功能
|
||
{
|
||
CBatchDimDlg dlgDim;
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
dlgDim.Create(dlgDim.IDD, acedGetAcadFrame());
|
||
}
|
||
dlgDim.ShowWindow(TRUE);
|
||
|
||
int nRetBatchDim = BatchDim(dlgDim, mat);
|
||
if (nRetBatchDim == RTKWORD) // 切换到单点标注
|
||
{
|
||
dlgDim.DestroyWindow(); // add by lgy 20120531,引起cad无法打开图纸,创建图纸
|
||
continue;
|
||
}
|
||
else // 结束命令
|
||
{
|
||
dlgDim.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if (nRet != RTNORM)
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
if (RTNORM != ads_getpoint(ptLastUcs, _T("\n请点取标注点<退出>:"), ptLoc))
|
||
return;
|
||
}
|
||
|
||
// [10/22/2007 nsh]
|
||
// sg modify 120618,解决设置固定度角后,坐标文字位置不正确的问题
|
||
XPoint saveFirstPoint;
|
||
// savePoint = ptLoc; // 对保存第一点的初始化
|
||
saveFirstPoint = ptLoc; // 对保存第一点的初始化
|
||
//--end--
|
||
bFirst = false;
|
||
ptLastUcs = ptLoc;
|
||
ptLoc = GlobalFunc::Ucs2Wcs(ptLoc);
|
||
XPoint ptLocWcs = ptLoc;
|
||
|
||
if (CCoordDlg::IsUcsPoint())
|
||
ptLoc = GlobalFunc::Wcs2Ucs(ptLoc);
|
||
else if (CCoordDlg::IsWcsPoint())
|
||
ptLoc.TransformBy(mat);
|
||
//else if (CCoordDlg::IsRedLinePoint())
|
||
// ptLoc = TranslatePtFromRedline(ptLoc);
|
||
|
||
double x, y;
|
||
if (CCoordDlg::s_iUnitType == 0) // mm-M
|
||
{
|
||
x = _AS_METER(ptLoc.y);
|
||
y = _AS_METER(ptLoc.x);
|
||
}
|
||
else // M-M
|
||
{
|
||
x = ptLoc.y;
|
||
y = ptLoc.x;
|
||
}
|
||
|
||
if (fabs(x) < 1E-6)
|
||
x = 0;
|
||
if (fabs(y) < 1E-6)
|
||
y = 0;
|
||
|
||
AecXDbSymbCoord *pCoord = new AecXDbSymbCoord;
|
||
pCoord->m_bInJig = true;
|
||
pCoord->SetLocation(ptLocWcs);
|
||
pCoord->SetValue(XPoint(y, x));
|
||
// sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式
|
||
// pCoord->SetTextStyleId(InitTextStyle(TS_DIM));
|
||
pCoord->SetTextStyleId(InitTextStyle(TS_SYMBOL));
|
||
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
// pCoord->setLayer(pElev->GetDefaultLayer());
|
||
|
||
pCoord->SetAB(g_Option::instance().g_bABCoord);
|
||
pCoord->SetStyle((AecXDbSymbMultiLeader::TArrowStyle)g_Option::instance().g_nCoordArrowStyle);
|
||
pCoord->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));//modified by whl
|
||
pCoord->SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
pCoord->SetPrecNum(g_Option::instance().g_nCoordPrec);
|
||
if (CCoordDlg::IsUcsPoint())
|
||
pCoord->setColorIndex(4); // 与WCS区别
|
||
else if (CCoordDlg::IsWcsPoint())
|
||
pCoord->setColorIndex(3);
|
||
else if (CCoordDlg::IsRedLinePoint())
|
||
pCoord->setColorIndex(2);
|
||
|
||
CoordEdJig jig(pCoord);
|
||
// --------------------------------------------------- [10/22/2007 nsh]
|
||
// 以下是判断是否是有固定角度的限制
|
||
{
|
||
// 给jig加固定角度
|
||
if (CCoordDlg::m_bFixAngle)
|
||
{
|
||
jig.m_dFixAngle = ::_tstof(CCoordDlg::m_strAngle);
|
||
// sg modify 120618,解决设置固定度角后,坐标文字位置不正确的问题
|
||
jig.m_saveFirstPt = saveFirstPoint;
|
||
}
|
||
}
|
||
// --end--
|
||
jig.SetPrompt(_T("\n点取坐标标注方向<退出>:"));
|
||
|
||
int nRet = jig.DoIt();
|
||
// modify by xly on 100915 实体是否设置在默认层
|
||
// if(nRet==RTNORM)
|
||
// pCoord->AddToCSpace(Adesk::kTrue);
|
||
if (nRet == RTNORM)
|
||
{
|
||
pCoord->m_bInJig = false;
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbCoord*)pCoord->clone());
|
||
DELETE_PTR(pCoord);
|
||
}
|
||
else
|
||
delete pCoord;
|
||
}
|
||
}
|
||
|
||
AcDbObjectId SymbElev()
|
||
{
|
||
BOOL bOrderCon = FALSE;
|
||
AcDbObjectId idRet;
|
||
DList<AcDbObjectId> lstElevId;
|
||
// 获得前次绘制的最后一个点,并获得数据
|
||
GlobalFunc::GetEntFromBlockByDxf(lstElevId, _T("AEC_BIAOGAOBIAOZHU"));
|
||
AcDbObjectId *pLast = lstElevId.Tail();
|
||
XPoint ptLast;
|
||
double *pLastLoc = NULL;
|
||
double nLastElev = 0.0;
|
||
if (pLast)
|
||
{
|
||
OPENOBJ_BEGIN(*pLast, AcDb::kForRead, AecXDbSymbElevation, pLastElev);
|
||
if (pLastElev)
|
||
{
|
||
ptLast = pLastElev->GetLocation();
|
||
nLastElev = _tstof(pLastElev->GetText());
|
||
pLastLoc = &ptLast.x;
|
||
bOrderCon = TRUE;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
XPoint ptLoc;
|
||
// 建立标注实体
|
||
AecXDbSymbElevation *pElev = new AecXDbSymbElevation;
|
||
pElev->SetTextStyleId(GlobalFunc::GetTextStyleId(_T("STANDARD")));//20160920 wlw 防止出现字体形文件错误
|
||
pElev->SetLocation(ptLoc);
|
||
pElev->SetBaseLine(g_bHasBase);
|
||
pElev->SetLeader(g_bHasLeader);
|
||
pElev->SetBaseLen(g_nBaseLen);
|
||
pElev->SetLeaderLen(g_nLeaderLen);
|
||
// sg delete 090209,文字样式的处理,放在SymbElev2函数中
|
||
// pElev->SetTextStyleId(InitTextStyle(TS_DIM));
|
||
pElev->SetTextHeight(g_dTextHeight); // sg add 090212,增加文字高度设置
|
||
pElev->SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen());
|
||
|
||
// delete by xly on 100915 设实体图层放在AddToSpace函数中
|
||
//pElev->setLayer(pElev->GetDefaultLayer());
|
||
pElev->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // modified by whl
|
||
// sg modify 090212,增加文字齐线端、是否规范样式,是否加括号的设置
|
||
pElev->SetParentheses(g_bParentheses);
|
||
pElev->SetAtLineSide(g_bElevSideText);
|
||
pElev->SetStandard(g_bStandard);
|
||
CElevDlg::g_pElevDlg->SetEntPoint(pElev);
|
||
|
||
// 获得精度
|
||
const TCHAR *szFormat1;
|
||
extern int g_iPrecision;
|
||
switch (g_iPrecision) {
|
||
case 0:
|
||
pElev->SetPrec2(TRUE);
|
||
szFormat1 = _T("%.2f");
|
||
break;
|
||
case 1:
|
||
pElev->SetPrec2(FALSE);
|
||
szFormat1 = _T("%.3f");
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// 点取标注点或参考点
|
||
ElevEdJig jig(pElev);
|
||
jig.m_ptBase = ptLast;
|
||
jig.m_fBaseElev = nLastElev;
|
||
if (!bOrderCon)
|
||
CElevDlg::g_pElevDlg->m_bOrderTou = TRUE;
|
||
else
|
||
jig.m_dPointX = GlobalFunc::Wcs2Ucs(ptLast).x;
|
||
|
||
CString ss;
|
||
int nIdx = 0;
|
||
CTemporaryResourceOverride vTemp(acedGetAcadResourceInstance());
|
||
while (1)
|
||
{
|
||
jig.SetOperCode(ElevEdJig::kMove);
|
||
jig.SetPrompt(_T("\n请点取标高点或 [参考标高(R)]<退出>:"));
|
||
// jig.SetKeyword(_T("R")); // sg modify 090217,增加了从屏幕拾取“字高”功能
|
||
jig.SetKeyword(_T("` R"));
|
||
|
||
int nRetCode = jig.DoIt(&nIdx);
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
CElevDlg::g_pElevDlg->m_bOrderTou = FALSE;
|
||
if (nRetCode == RTNORM && nRetCode != RTKWORD)
|
||
{
|
||
pElev->SetLocation(jig.GetDragPoint());
|
||
break;
|
||
}
|
||
else if (nRetCode == RTKWORD)
|
||
{
|
||
if (nIdx == 0) // sg add 090217
|
||
{
|
||
CElevDlg::g_pElevDlg->GetTextHeight();
|
||
CElevDlg::g_pElevDlg->UpdataEnt();
|
||
continue;
|
||
}
|
||
|
||
Entity entRef;
|
||
if (entRef.FilterSelect(_T("\n点取参考标高<退出>: "), RBList(RTDXF0, _T("AEC_BIAOGAOBIAOZHU"), NULL)) == RTNORM)
|
||
{
|
||
OPENOBJ_BEGIN(entRef, AcDb::kForRead, AecXDbSymbElevation, pLastElev);
|
||
if (pLastElev)
|
||
{
|
||
ptLoc = pLastElev->GetLocation();
|
||
ss = pLastElev->GetText();
|
||
jig.m_ptBase = ptLoc;
|
||
jig.m_fBaseElev = _tstof(ss);
|
||
pElev->SetText(ss);
|
||
pElev->SetLocation(ptLoc);
|
||
jig.m_dPointX = GlobalFunc::Wcs2Ucs(ptLoc).x;
|
||
}
|
||
OPENOBJ_END();
|
||
continue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
delete pElev;
|
||
pElev = NULL;
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
// 对实体进行拖动循环
|
||
while (1)
|
||
{
|
||
int nRet;
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
{
|
||
// sg add 120608,对话框类和这些全局静态成员移植到ElevDlg.h类中,要求全部使用CElevDlg::g_pElevDlg->UpdataEnt();来更新对象数据
|
||
CElevDlg::g_pElevDlg->UpdataEnt();
|
||
CElevDlg::g_pElevDlg->m_bUpdateText = TRUE;
|
||
}
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
jig.SetOperCode(ElevEdJig::kDirection);
|
||
jig.SetPrompt(_T("\n请点取标高方向<退出>:"));
|
||
// jig.SetKeyword(_T("")); // sg modify 090217,增加了从屏幕拾取“字高”功能
|
||
// nRet = jig.DoIt();
|
||
// if (nRet != RTNORM)
|
||
jig.SetKeyword(_T("`"));
|
||
nRet = jig.DoIt(&nIdx);
|
||
if (nRet != RTNORM && nRet != RTKWORD)
|
||
{
|
||
delete pElev;
|
||
return NULL;
|
||
}
|
||
else if (nRet == RTKWORD) // sg add 090217
|
||
{
|
||
CElevDlg::g_pElevDlg->GetTextHeight();
|
||
CElevDlg::g_pElevDlg->UpdataEnt();
|
||
continue;
|
||
}
|
||
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
{
|
||
CElevDlg::g_pElevDlg->m_bUpdateText = FALSE;
|
||
// if (!g_bHightWrite) // sg add 120609,不能直接使用静态变量
|
||
}
|
||
|
||
// if (g_bHasBase) // sg add 120609,不能直接使用静态变量
|
||
if (CElevDlg::g_pElevDlg != NULL && CElevDlg::g_pElevDlg->IsHasBase())
|
||
{
|
||
while (1) // sg modify 090217,增加了从屏幕拾取“字高”功能
|
||
{
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
CElevDlg::g_pElevDlg->m_bHatchTou = TRUE; // 此时填充、圆点按钮不可用
|
||
jig.SetOperCode(ElevEdJig::kBaseLine);
|
||
jig.SetPrompt(_T("\n点取基线位置<退出>:"));
|
||
// jig.SetKeyword(_T(""));
|
||
// nRet = jig.DoIt();
|
||
jig.SetKeyword(_T("`"));
|
||
nRet = jig.DoIt(&nIdx);
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
CElevDlg::g_pElevDlg->m_bHatchTou = FALSE;
|
||
// if (nRet != RTNORM)
|
||
if (nRet != RTNORM && nRet != RTKWORD)
|
||
{
|
||
delete pElev;
|
||
return NULL;
|
||
}
|
||
else if (nRet == RTKWORD) // sg add 090217
|
||
{
|
||
CElevDlg::g_pElevDlg->GetTextHeight();
|
||
CElevDlg::g_pElevDlg->UpdataEnt();
|
||
continue;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
//if (g_bHasLeader) // sg add 120609,不能直接使用静态变量
|
||
if (CElevDlg::g_pElevDlg != NULL && CElevDlg::g_pElevDlg->IsHasLeader())
|
||
{
|
||
while (1) // sg modify 090217,增加了从屏幕拾取“字高”功能
|
||
{
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
CElevDlg::g_pElevDlg->m_bHatchTou = TRUE; // 此时填充按钮不可用
|
||
jig.SetOperCode(ElevEdJig::kLeader);
|
||
jig.SetPrompt(_T("\n点取引线位置<退出>:"));
|
||
// jig.SetKeyword(_T(""));
|
||
// nRet = jig.DoIt();
|
||
jig.SetKeyword(_T("`"));
|
||
nRet = jig.DoIt(&nIdx);
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
CElevDlg::g_pElevDlg->m_bHatchTou = FALSE;
|
||
// if (nRet != RTNORM)
|
||
if (nRet != RTNORM && nRet != RTKWORD)
|
||
{
|
||
delete pElev;
|
||
return NULL;
|
||
}
|
||
else if (nRet == RTKWORD) // sg add 090217
|
||
{
|
||
CElevDlg::g_pElevDlg->GetTextHeight();
|
||
CElevDlg::g_pElevDlg->UpdataEnt();
|
||
continue;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
//g_nLeaderLen = pElev->GetLeaderLen(); // sg add 120609,不能直接使用静态变量
|
||
//g_nBaseLen = pElev->GetBaseLen();
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
{
|
||
CElevDlg::g_pElevDlg->SetLeaderLen(pElev->GetLeaderLen());
|
||
CElevDlg::g_pElevDlg->SetBaseLen(pElev->GetBaseLen());
|
||
|
||
CElevDlg::g_pElevDlg->UpdateEntText();
|
||
|
||
// modify by xly on 100915 设置实体是否添加在默认图层
|
||
//idRet = pElev->AddToCSpace(Adesk::kTrue);
|
||
idRet = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbElevation*)pElev->clone());
|
||
DELETE_PTR(pElev);
|
||
}
|
||
else
|
||
delete pElev;
|
||
return idRet;
|
||
}
|
||
|
||
void SymbElev3()//总图标高
|
||
{
|
||
AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL);
|
||
if (!idTextStyle)
|
||
return;
|
||
|
||
CTemporaryResourceOverride vTemp;
|
||
CMDIFrameWnd* pParent = (CMDIFrameWnd*)acedGetAcadFrame();
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
{
|
||
CElevDlg::g_pElevDlg->DestroyWindow();
|
||
CElevDlg::g_pElevDlg = NULL;
|
||
}
|
||
|
||
if (!CElevDlg::g_pElevDlg)
|
||
CElevDlg::g_pElevDlg = new CElevDlg(pParent);
|
||
CElevDlg::g_pElevDlg->SetSitePlanDlg(TRUE);//总图标高
|
||
//注释 by lgy 20120111 文字样式必须有记忆功能
|
||
// sg add 090309,标高标注,默认绘制文字样式为“_TCH_DIM”
|
||
//CElevDlg::g_pElevDlg->m_csFontStyle = (const TCHAR*)GetSymbolName(idTextStyle);
|
||
|
||
CElevDlg::g_pElevDlg->Create(IDD_ELEV, (CWnd*)pParent);
|
||
CElevDlg::g_pElevDlg->ShowWindow(SW_SHOW);
|
||
|
||
BOOL bContinue = TRUE;
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
AecXDbSymbElevation *pLastElev = NULL;
|
||
while (CElevDlg::g_pElevDlg != NULL &&
|
||
CElevDlg::g_pElevDlg->GetSafeHwnd() != NULL)
|
||
{
|
||
if (!bContinue)
|
||
break;
|
||
|
||
AcDbObjectId idRet = SymbElev();
|
||
if (!idRet)
|
||
{
|
||
bContinue = FALSE;
|
||
break;
|
||
}
|
||
|
||
XPoint ptLast;
|
||
double nLastElev;
|
||
OPENOBJ_BEGIN(idRet, AcDb::kForRead, AecXDbSymbElevation, pLastElev);
|
||
ASSERT(pLastElev);
|
||
ptLast = pLastElev->GetLocation();
|
||
nLastElev = _tstof(pLastElev->GetText());
|
||
OPENOBJ_END();
|
||
|
||
if (!g_bContinue)
|
||
break;
|
||
|
||
XPoint ptLoc;
|
||
CTemporaryResourceOverride vTemp(acedGetAcadResourceInstance());
|
||
while (1)
|
||
{
|
||
int nIdx = 0;
|
||
ptLoc = GlobalFunc::Ucs2Wcs(ptLoc);
|
||
nLastElev = nLastElev + _AS_METER(ptLoc.y - ptLast.y); // [12/4/2007 nsh]
|
||
OPENOBJ_BEGIN(idRet, AcDb::kForRead, AecXDbSymbElevation, pLastElev);
|
||
ASSERT(pLastElev);
|
||
|
||
AecXDbSymbElevation *pNewElev = (AecXDbSymbElevation *)pLastElev->clone();
|
||
ASSERT(pNewElev);
|
||
XPoint pt = pNewElev->GetLocation();
|
||
CElevDlg::g_pElevDlg->SetEntPoint(pNewElev);
|
||
|
||
ElevEdJig jig(pNewElev);
|
||
jig.m_ptBase = pt;
|
||
jig.m_fBaseElev = _tstof(pLastElev->GetText());
|
||
pt = GlobalFunc::Wcs2Ucs(pt);
|
||
jig.m_dPointX = pt.x;
|
||
jig.SetOperCode(ElevEdJig::kMove);
|
||
jig.SetPrompt(_T("\n下一点或 [第一点(F)]<退出>:"));
|
||
// jig.SetKeyword(_T("F")); // sg modify 090305,解决从标第二个符号起,无法点取字高
|
||
jig.SetKeyword(_T("` F"));
|
||
int nRet = jig.DoIt(&nIdx);
|
||
if (nRet == RTKWORD)
|
||
{
|
||
if (nIdx == 0) // sg add 090305,解决从标第二个符号起,无法点取字高
|
||
{
|
||
CElevDlg::g_pElevDlg->GetTextHeight();
|
||
CElevDlg::g_pElevDlg->UpdataEnt();
|
||
continue;
|
||
}
|
||
delete pNewElev;
|
||
break;
|
||
}
|
||
if (nRet != RTNORM)
|
||
{
|
||
delete pNewElev;
|
||
bContinue = FALSE;
|
||
break;
|
||
}
|
||
|
||
pNewElev->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // add by whl
|
||
pNewElev->SetText(XString(_T("%f"), nLastElev));
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
{
|
||
CElevDlg::g_pElevDlg->UpdateEntText();
|
||
}
|
||
|
||
// modify by xly on 100915 设置实体是否添加在默认图层
|
||
//idRet = pNewElev->AddToCSpace(Adesk::kTrue);
|
||
idRet = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbElevation*)pNewElev->clone());
|
||
DELETE_PTR(pNewElev);
|
||
|
||
OPENOBJ_END();
|
||
|
||
ptLast = ptLoc;
|
||
if (!g_bContinue)
|
||
{
|
||
bContinue = FALSE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (CElevDlg::g_pElevDlg != NULL)
|
||
{
|
||
CElevDlg::g_pElevDlg->DestroyWindow();
|
||
CElevDlg::g_pElevDlg = NULL;
|
||
}
|
||
};
|
||
|
||
void DBL_AEC_BIAOGAOBIAOZHU()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_BIAOGAOBIAOZHU"), id);
|
||
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbElevation, pElev);
|
||
if (pElev != NULL)
|
||
{
|
||
|
||
CString sElv = pElev->GetText();
|
||
CElevDlg dlg(pElev);
|
||
CTemporaryResourceOverride vTemp;
|
||
dlg.DoModal();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
XPoint pptfirst;
|
||
void SymbLeader()
|
||
{
|
||
BOOL bSideText = FALSE;
|
||
|
||
CLeaderDlg dlg(FALSE, acedGetAcadFrame());
|
||
// sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式
|
||
//AcDbObjectId idTextStyle = InitTextStyle(TS_DIM);
|
||
AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL);
|
||
if (!idTextStyle)
|
||
return;
|
||
//modify by lgy 20120206 要求记录上次退出命令时设置的文字样式,切换图纸时原本没有的样式时初始化样式
|
||
//dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle);
|
||
if (dlg.m_strFontStyle == _T(""))
|
||
{
|
||
dlg.m_strFontStyle = (const TCHAR *)GlobalFunc::GetSymbolName(idTextStyle);
|
||
}
|
||
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
||
return;
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
AecXDbSymbMultiLeader ent;
|
||
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
//ent.setLayer(ent.GetDefaultLayer());
|
||
ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
ent.SetTextBaseLen(ent.GetDefaultTextBaseLen());
|
||
ent.SetSideText(bSideText);
|
||
|
||
XPoint ptFirst, ptLeader;
|
||
AecXDbSymbMultiLeader::TArrowStyle ar = AecXDbSymbMultiLeader::kNone;
|
||
while (ads_getpoint(NULL, _T("\n请给出标注第一点<退出>: "), ptFirst) == RTNORM)
|
||
{
|
||
pptfirst = ptFirst; // [10/18/2007 nsh]
|
||
XPointList lstVertexes;
|
||
lstVertexes.Append(new XPoint(GlobalFunc::Ucs2Wcs(ptFirst)));
|
||
ent.SetLeaderVertexes(lstVertexes);
|
||
dlg.Dlg2Obj(&ent);
|
||
dlg.m_bPost = TRUE;
|
||
|
||
sAngle = ::_tstof(dlg.m_sFixAngle); // [10/18/2007 nsh]
|
||
LeaderEdJig jig(&ent);
|
||
//add by lgy 20120206 固定角度修改后不起作用
|
||
jig.SetDlg(&dlg);
|
||
|
||
jig.SetOperCode(LeaderEdJig::kLeader);
|
||
jig.SetPrompt(_T("\n输入引线位置或 [更改箭头型式(A)]<退出>: "));
|
||
jig.SetKeyword(_T("` A"));
|
||
jig.setUserInputControls(AcEdJig::kNullResponseAccepted);
|
||
|
||
int nRet = RTNORM;
|
||
while (1)
|
||
{
|
||
if (!dlg.m_bFixAngle)
|
||
{
|
||
jig.m_bFixAngle = FALSE;
|
||
}
|
||
else
|
||
{
|
||
jig.m_bFixAngle = TRUE;
|
||
jig.m_dFixAngle = _tstof(LPCTSTR(dlg.m_sFixAngle));
|
||
sAngle = _tstof(LPCTSTR(dlg.m_sFixAngle)); // [10/18/2007 nsh]
|
||
}
|
||
|
||
int kwd(0);
|
||
nRet = jig.DoIt(&kwd);
|
||
if (nRet == RTNORM)
|
||
break;
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (kwd == 0)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (ar == AecXDbSymbMultiLeader::kNone)
|
||
ar = AecXDbSymbMultiLeader::kDote;
|
||
else if (ar == AecXDbSymbMultiLeader::kDote)
|
||
ar = AecXDbSymbMultiLeader::kArrow;
|
||
else if (ar == AecXDbSymbMultiLeader::kArrow)
|
||
ar = AecXDbSymbMultiLeader::kCrossing;
|
||
else
|
||
ar = AecXDbSymbMultiLeader::kNone;
|
||
ent.SetArrow(ar);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
jig.SetKeyword(_T("`"));
|
||
jig.SetOperCode(LeaderEdJig::kTextLine);
|
||
jig.SetPrompt(_T("\n点取文字基线位置<退出>: "));
|
||
while (1)
|
||
{
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNORM)
|
||
break;
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
// modify by xly on 100915 实体是否设置在默认层
|
||
//AcDbObjectId newId = ((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue);
|
||
AcDbObjectId newId = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbMultiLeader *)ent.clone());
|
||
|
||
XPushVar<int> orthomode(_T("ORTHOMODE"), 0);
|
||
// jig.SetOperCode(LeaderEdJig::kVertex); // sg delete 090320,防止闪烁问题
|
||
// jig.SetPrompt(_T("\n输入其他的标注点<结束>: "));
|
||
|
||
// sg modify 090320
|
||
OPENOBJ_BEGIN(newId, AcDb::kForRead, AecXDbSymbMultiLeader, pLeader);
|
||
if (pLeader != NULL)
|
||
{
|
||
XPoint ptBase = pLeader->GetLeaderPoint();
|
||
while (1)
|
||
{
|
||
// nRet = jig.DoIt(); // sg delete 090320,防止闪烁问题
|
||
XPoint ptAdd;
|
||
// sg delete 090330,还原为JIG算法,解决与正交的矛盾问题
|
||
// nRet = ads_getpoint(Wcs2Ucs(ptBase), _T("\n输入其他的标注点<结束>: "), ptAdd);
|
||
|
||
// sg modify 120612,接口使用错误,布局转角的接口是GetLayoutRotation
|
||
// TLeaderAddOtherPtJig jig2(&dlg, Ucs2Wcs(ptFirst), ptBase, pLeader->GetTextRotation());
|
||
LeaderAddOtherPtJig jig2(&dlg, GlobalFunc::Ucs2Wcs(ptFirst), ptBase, pLeader->GetLayoutRotation());
|
||
jig2.SetPrompt(_T("\n输入其他的标注点<结束>: "));
|
||
jig2.SetKeyword(_T("`"));
|
||
nRet = jig2.DoIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
//复选框置灰
|
||
dlg.SetCheckBoxStatus(FALSE);
|
||
|
||
// ptAdd = Ucs2Wcs(ptAdd);
|
||
ptAdd = jig2.GetPickPoint();
|
||
|
||
XPointList pts;
|
||
pLeader->GetLeaderVertexes(pts);
|
||
pts.Append(new XPoint(ptAdd));
|
||
|
||
if (pLeader->upgradeOpen() == Acad::eOk)
|
||
{
|
||
//add by lgy 20120206 引线平行在点取引线点的时候不好使
|
||
dlg.Dlg2Obj(pLeader);
|
||
|
||
// pLeader->SetLeaderVertexes(pts); // sg modify 120104,根据修接口修改函数,这种情况下,不需要修改点m_ptLeaderDirection
|
||
pLeader->SetLeaderVertexes(pts, FALSE);
|
||
pLeader->downgradeOpen();
|
||
}
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else if (nRet == RTNONE)
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
{
|
||
// sg add 090324,记忆是否启用“固定角度”,以及“固定角度”值
|
||
g_sLeadFixAngle = dlg.m_sFixAngle;
|
||
g_bLeadFixAngle = dlg.m_bFixAngle;
|
||
dlg.DestroyWindow();
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
|
||
//复选框还原
|
||
dlg.SetCheckBoxStatus();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
dlg.AddToRecent();
|
||
if (!dlg.m_bContinue)
|
||
break;
|
||
dlg.m_bPost = FALSE;
|
||
}
|
||
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
{
|
||
g_sLeadFixAngle = dlg.m_sFixAngle;
|
||
g_bLeadFixAngle = dlg.m_bFixAngle;
|
||
dlg.DestroyWindow();
|
||
}
|
||
}
|
||
|
||
void DBL_AEC_YINCHUBIAOZU()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_YINCHUBIAOZU"), id);
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbMultiLeader, pLeader);
|
||
if (!pLeader) return;
|
||
OPENOBJ_END()
|
||
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbMultiLeader, pLeader);
|
||
if (!pLeader) return;
|
||
|
||
CEditLeaderDlg dlg(acedGetAcadFrame());
|
||
dlg.Obj2Dlg(pLeader);
|
||
|
||
CTemporaryResourceOverride vTemp;
|
||
INT_PTR nResult = dlg.DoModal();
|
||
if (nResult == IDOK)
|
||
{
|
||
if (pLeader->upgradeOpen() == Acad::eOk)
|
||
{
|
||
dlg.Dlg2Obj(pLeader);
|
||
pLeader->downgradeOpen();
|
||
}
|
||
}
|
||
else if (nResult == 1000)
|
||
{
|
||
int nRet = RTNORM;
|
||
while (nRet == RTNORM)
|
||
{
|
||
XPointList lstPts; // sg add 090330,为调用JIG类做准备
|
||
pLeader->GetLeaderVertexes(lstPts);
|
||
AcGePoint3d ptBase = pLeader->GetLeaderPoint().AsAcGePoint3d(),
|
||
ptVertexes1;
|
||
if (lstPts.Length() > 0)
|
||
ptVertexes1 = lstPts[0]->AsAcGePoint3d();
|
||
|
||
XPoint ptAdd;
|
||
// sg modify 090330,改为JIG类
|
||
// nRet = ads_getpoint(Wcs2Ucs(pLeader->GetLeaderPoint()), _T("\n请点取要增加的标注点<退出>: "), ptAdd);
|
||
LeaderAddOtherPtJig jig(dlg.m_bAllPtsOnLine, pLeader->GetLeaderDirection(), ptBase, pLeader->GetTextRotation(), pLeader->IsLeaderParall());
|
||
jig.SetPrompt(_T("\n请点取要增加的标注点<退出>: "));
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
// ptAdd = Ucs2Wcs(ptAdd); // sg modify 090330
|
||
ptAdd = jig.GetPickPoint();
|
||
if (pLeader->upgradeOpen() == Acad::eOk)
|
||
{
|
||
XPointList pts;
|
||
pLeader->GetLeaderVertexes(pts);
|
||
pts.Append(new XPoint(ptAdd));
|
||
// pLeader->SetLeaderVertexes(pts); // sg modify 120104,根据修接口修改函数,这种情况下,不需要修改点m_ptLeaderDirection
|
||
pLeader->SetLeaderVertexes(pts, FALSE);
|
||
dlg.Dlg2Obj(pLeader); // sg add 090220,解决了需求平台275
|
||
pLeader->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pLeader->close();
|
||
return;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
void DrawCloud()
|
||
{
|
||
XPushVar<int> vOsMode(_T("OSMODE"), 0);
|
||
|
||
extern TCHAR* LAY_MODI_DIM;
|
||
InitTextStyle(TS_SECTION);
|
||
AcDbObjectId idModi = InitLayer(LAY_MODI_DIM),
|
||
idTextLayer = InitLayer(LAY_TEXT);
|
||
OPENOBJ_BEGIN(idModi, AcDb::kForWrite, AcDbLayerTableRecord, pLayer);
|
||
if (pLayer != NULL)
|
||
{
|
||
pLayer->setIsPlottable(false); // 设置图层不打印
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
CCloudLineDlg dlg;
|
||
{
|
||
CAcModuleResourceOverride vTemp;
|
||
if (!dlg.Create(dlg.IDD, (CWnd*)acedGetAcadFrame()))
|
||
return;
|
||
}
|
||
acedGetAcadDwgView()->SetFocus();
|
||
dlg.ShowWindow(SW_SHOW);
|
||
|
||
BOOL bHasModi(FALSE);
|
||
XPoly2D polyModi;
|
||
AcDbObjectId idEnt;
|
||
|
||
while (TRUE)
|
||
{
|
||
dlg.SetIsChangeType(false);
|
||
polyModi.Reset();
|
||
bHasModi = FALSE;
|
||
|
||
int iType = dlg.GetDrawLineStyle();
|
||
if (iType == 0) // 圆形云线
|
||
{
|
||
XPoint ptCenter;
|
||
if (acedGetPoint(NULL, _T("\n请指定圆形云线的圆心<退出>:"), ptCenter) != RTNORM)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
static double dRadius = 0.0;
|
||
static bool bFirstDrawCloud = true; // 是否第一次进入云线命令
|
||
|
||
if (bFirstDrawCloud)
|
||
{
|
||
if (acedGetDist(ptCenter, _T("\n请指定圆形云线的半径<退出>:"), &dRadius) != RTNORM)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
bFirstDrawCloud = false;
|
||
}
|
||
else
|
||
{
|
||
CString csTemp;
|
||
csTemp.Format(_T("\n请指定圆形云线的半径<%.0f>:"), dRadius);
|
||
|
||
int nRet = acedGetDist(ptCenter, csTemp, &dRadius);
|
||
if (nRet != RTNORM && nRet != RTNONE)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
if (fabs(dRadius) < 1.0E-3)
|
||
{
|
||
acutPrintf(_T("输入的半径不能为0!"));
|
||
continue;
|
||
}
|
||
}
|
||
ptCenter = GlobalFunc::Ucs2Wcs(ptCenter);
|
||
|
||
// 生成路径线polyModi,必须是逆时针的
|
||
XArc arc1(ptCenter, dRadius, 0, PI), // 逆弧
|
||
arc2(ptCenter, dRadius, PI, 2 * PI);
|
||
XCurveSegment seg;
|
||
seg = arc1;
|
||
dlg.GetCloudLinePoly(seg, polyModi);
|
||
seg = arc2;
|
||
dlg.GetCloudLinePoly(seg, polyModi);
|
||
polyModi.SetClosed();
|
||
}
|
||
else if (iType == 1) // 矩形云线
|
||
{
|
||
// sg modify 120612,如果是矩形云线,强制正交关闭
|
||
XPushVar<int> orthomode(_T("ORTHOMODE"), 0);
|
||
|
||
XPoint pt1, pt2;
|
||
if (acedGetPoint(NULL, _T("\n请指定第一个角点<退出>:"), pt1) != RTNORM)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
if (acedGetPoint(pt1, _T("\n请指定另一个角点<退出>:"), pt2) != RTNORM)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
// 生成路径线polyModi,必须是逆时针的
|
||
XPoly2D poly;
|
||
XPoint pt3(pt2.x, pt1.y, 0),
|
||
pt4(pt1.x, pt2.y, 0);
|
||
poly.AppendNode(GlobalFunc::Ucs2Wcs(pt1));
|
||
poly.AppendNode(GlobalFunc::Ucs2Wcs(pt3));
|
||
poly.AppendNode(GlobalFunc::Ucs2Wcs(pt2));
|
||
poly.AppendNode(GlobalFunc::Ucs2Wcs(pt4));
|
||
poly.SetClosed();
|
||
|
||
if (poly.PathArea() > 0)
|
||
poly.Reverse();
|
||
|
||
dlg.GetCloudLinePoly(poly, polyModi);
|
||
polyModi.SetClosed();
|
||
}
|
||
else if (iType == 2) //任意形状弧线
|
||
{
|
||
bHasModi = TRUE;
|
||
|
||
XPoint ptFirst;
|
||
if (acedGetPoint(NULL, _T("\n指定起点 <退出>:"), ptFirst) != RTNORM)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
acutPrintf(_T("\n沿云线路径引导十字光标..."));
|
||
|
||
double dMaxValue = dlg.GetMaxValue(),
|
||
dMinValue = dlg.GetMinValue();
|
||
|
||
AecXDbSymbModi *pEnt = new AecXDbSymbModi;
|
||
pEnt->SetEndWidth(dlg.GetEndWidth());
|
||
|
||
CloudLineJig jig(pEnt, GlobalFunc::Ucs2Wcs(ptFirst), dMaxValue, dMinValue);
|
||
int nKeyIndex(0),
|
||
nRet = jig.DoIt(&nKeyIndex);
|
||
if (nRet != RTNORM)
|
||
{
|
||
delete pEnt;
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
pEnt->SetEndWidth(dlg.GetEndWidth());
|
||
pEnt->SetArcAngle(0.5); // 弧线的凸度固定为0.5
|
||
pEnt->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0));
|
||
pEnt->setLayer(idModi);
|
||
idEnt = GlobalFunc::AddToCurrentSpace((AecXDbSymbModi*)pEnt->clone(), TRUE);
|
||
DELETE_PTR(pEnt);
|
||
acutPrintf(_T("\n修订云线完成"));
|
||
}
|
||
else if (iType == 3) //指定对象
|
||
{
|
||
//int iCursorType = g_nOsnapType;
|
||
//DocSetWallOsnapType(1);
|
||
|
||
Entity ent;
|
||
RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,CIRCLE"), NULL);
|
||
if (ent.FilterSelect(_T("\n请选择要转换为云线的闭合对象<退出>:"), mask) != RTNORM)
|
||
{
|
||
if (!dlg.GetIsChangeType())
|
||
{
|
||
//DocSetWallOsnapType(iCursorType);
|
||
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
//DocSetWallOsnapType(iCursorType);
|
||
|
||
if (ent.Is(_T("LWPOLYLINE")) || ent.Is(_T("POLYLINE")))
|
||
{
|
||
XPoly2D poly(ent);
|
||
if (!poly.IsClosed())
|
||
{
|
||
acutPrintf(_T("无法将此对象转换为修订云线,请重新选择闭合对象!"));
|
||
continue;
|
||
}
|
||
|
||
// 生成路径线polyModi,必须是逆时针的
|
||
if (poly.PathArea() > 0)
|
||
poly.Reverse();
|
||
|
||
dlg.GetCloudLinePoly(poly, polyModi);
|
||
polyModi.SetClosed();
|
||
|
||
ent.Erase();
|
||
}
|
||
else if (ent.Is(_T("CIRCLE")))
|
||
{
|
||
XCircle circle(ent);
|
||
XPoint ptCenter = circle.GetCenterPt();
|
||
double dDistance = circle.GetRadius();
|
||
|
||
// 生成路径线polyModi,必须是逆时针的
|
||
XArc arc1(ptCenter, dDistance, 0, PI),
|
||
arc2(ptCenter, dDistance, PI, 2 * PI);
|
||
|
||
XCurveSegment seg;
|
||
seg = arc1;
|
||
dlg.GetCloudLinePoly(seg, polyModi);
|
||
seg = arc2;
|
||
dlg.GetCloudLinePoly(seg, polyModi);
|
||
polyModi.SetClosed();
|
||
|
||
ent.Erase();
|
||
}
|
||
}
|
||
|
||
// 创建实体
|
||
if (!bHasModi)
|
||
{
|
||
AecXDbSymbModi *pEnt = new AecXDbSymbModi;
|
||
pEnt->SetModiPoly(polyModi);
|
||
pEnt->SetEndWidth(dlg.GetEndWidth());
|
||
pEnt->SetArcAngle(0.5); // 弧线的凸度固定为0.5
|
||
pEnt->setLayer(idModi);
|
||
pEnt->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0));
|
||
idEnt = GlobalFunc::AddToCurrentSpace(pEnt, TRUE);
|
||
}
|
||
|
||
// 处理版次文字
|
||
CString csText;
|
||
double dHeight(0.0);
|
||
AcDbObjectId idTextStyle;
|
||
BOOL bShowText(FALSE);
|
||
dlg.GetTextParam(bShowText, csText, dHeight, idTextStyle);
|
||
|
||
if (!bShowText)
|
||
{
|
||
OPENOBJ_BEGIN(idEnt, AcDb::kForWrite, AecXDbSymbModi, pModi);
|
||
if (pModi != NULL)
|
||
{
|
||
pModi->SetIsShowEdition(FALSE);
|
||
pModi->SetTextLayerId(idTextLayer); // 增加对文字通用图层的设置
|
||
pModi->SetTextStyleId(idTextStyle);
|
||
pModi->SetEditionText(csText);
|
||
pModi->SetTextHeight(dHeight);
|
||
pModi->SetEditLocal(pModi->GetDefaultTextLocation());
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
continue;
|
||
}
|
||
|
||
XPoint ptEditLocal;
|
||
if (acedGetPoint(NULL, _T("\n请指定版次标志的位置<取消>:"), ptEditLocal) != RTNORM)
|
||
{
|
||
dlg.GetTextParam(bShowText, csText, dHeight, idTextStyle);
|
||
|
||
OPENOBJ_BEGIN(idEnt, AcDb::kForWrite, AecXDbSymbModi, pModi);
|
||
if (pModi != NULL)
|
||
{
|
||
pModi->SetIsShowEdition(FALSE);
|
||
pModi->SetTextStyleId(idTextStyle);
|
||
pModi->SetTextLayerId(idTextLayer); // 增加对文字通用图层的设置
|
||
pModi->SetEditionText(csText);
|
||
pModi->SetTextHeight(dHeight);
|
||
pModi->SetEditLocal(pModi->GetDefaultTextLocation());
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
continue;
|
||
}
|
||
ptEditLocal = GlobalFunc::Ucs2Wcs(ptEditLocal);
|
||
|
||
dlg.GetTextParam(bShowText, csText, dHeight, idTextStyle);
|
||
|
||
OPENOBJ_BEGIN(idEnt, AcDb::kForWrite, AecXDbSymbModi, pModi);
|
||
if (pModi != NULL)
|
||
{
|
||
pModi->SetTextStyleId(idTextStyle);
|
||
pModi->SetIsShowEdition(bShowText);
|
||
pModi->SetEditLocal(ptEditLocal);
|
||
pModi->SetTextHeight(dHeight);
|
||
pModi->SetEditionText(csText);
|
||
pModi->SetTextLayerId(idTextLayer); // 增加对文字通用图层的设置
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
void DBL_AEC_YUNXIAN()
|
||
{
|
||
return;
|
||
}
|
||
|
||
void SymbDrawingName()
|
||
{
|
||
// sg add 120706,9.0起图面标注给出一个独立的文字样式
|
||
AcDbObjectId idTextStyle = InitTextStyle(TS_DRAWINGNAME);
|
||
if (!idTextStyle)
|
||
return;
|
||
|
||
//int nDrawMode = DocGetDrawMode();
|
||
//DocSetDrawMode(DRAW_2D);
|
||
CDrawingNameDlg dlg(FALSE, acedGetAcadFrame());
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
||
{
|
||
//DocSetDrawMode(nDrawMode);
|
||
return;
|
||
}
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
|
||
while (1)
|
||
{
|
||
acedGetAcadDwgView()->SetFocus();
|
||
AecXDbDrawingName *pEnt = new AecXDbDrawingName;
|
||
dlg.Dlg2Obj(pEnt);
|
||
dlg.m_bPost = TRUE;
|
||
// sg modify 090320,8.0起,不再使用“文字转角”,转化为“布局转角”
|
||
// pEnt->SetRotation(Ucs2Wcs(0.0));
|
||
pEnt->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
//pEnt->setLayer(pEnt->GetDefaultLayer());
|
||
if (g_Option::instance().g_bTextDefaultLayer)
|
||
{
|
||
pEnt->setLayer(pEnt->GetDefaultLayer());
|
||
}
|
||
|
||
pEnt->m_bInJig = true;
|
||
DrawingNameJig jig(pEnt);
|
||
jig.SetKeyword(_T("`"));
|
||
jig.SetPrompt(_T("\n请点取插入位置<退出>:"));
|
||
int nRet = jig.start();
|
||
if (nRet == RTNORM)
|
||
{
|
||
dlg.AddToRecent();
|
||
if (!dlg.m_bContinue)
|
||
break;
|
||
dlg.m_bPost = FALSE;
|
||
pEnt->m_bInJig = false;
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
}
|
||
|
||
void DBL_AEC_TUMINGBIAOZHU()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_TUMINGBIAOZHU"), id);
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbDrawingName, pDrawingName);
|
||
if (!pDrawingName) return;
|
||
|
||
CTemporaryResourceOverride vTemp;
|
||
CDrawingNameDlg dlg(TRUE, acedGetAcadFrame());
|
||
dlg.Obj2Dlg(pDrawingName);
|
||
|
||
INT_PTR nRet = dlg.DoModal();
|
||
if (nRet == IDOK)
|
||
{
|
||
if (pDrawingName->upgradeOpen() == Acad::eOk)
|
||
{
|
||
dlg.Dlg2Obj(pDrawingName);
|
||
pDrawingName->downgradeOpen();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pDrawingName->close();
|
||
return;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
void SymbIndex()
|
||
{
|
||
//add by lxb on 2011/12/21
|
||
CTemporaryResourceOverride vTemp;
|
||
//非模式对话框
|
||
AcDbObjectId idText = InitTextStyle(TS_LABEL);
|
||
// sg modify 120106,给“TS_INDEXSCALE”独立出来一个文字样式,传给索引图面外的文字
|
||
AcDbObjectId idScaleStyle = InitTextStyle(TS_INDEXSCALE);
|
||
|
||
CDrawingIndexDlg dlg;
|
||
if (!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
||
{
|
||
return;
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
|
||
bool bExit = false;
|
||
|
||
while (TRUE)
|
||
{
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
AecXDbSymbDrawingIndex *pIndex = new AecXDbSymbDrawingIndex;
|
||
pIndex->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
pIndex->SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
|
||
//JIG
|
||
DrawingIndexEdJig jig(pIndex, const_cast<LPTSTR>(_T("\n请点取标注位置<退出>: ")), const_cast<LPTSTR>(_T("`")));
|
||
while (TRUE)
|
||
{
|
||
//获取对话框数据
|
||
dlg.Dlg2Obj(pIndex);
|
||
|
||
int istat = jig.doIt();
|
||
if (istat == AcEdJig::kNormal)
|
||
{
|
||
AcDbObjectId id = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbDrawingIndex*)pIndex->clone());
|
||
DELETE_PTR(pIndex);
|
||
break;
|
||
}
|
||
else if (istat == AcEdJig::kKW1)//PostCommand(_T("` ")
|
||
{
|
||
if (dlg.IsOpTextHeight())
|
||
{
|
||
dlg.TextHight();
|
||
}
|
||
}
|
||
else//PostCommand(_T(" ")或其他退出操作
|
||
{
|
||
bExit = true;
|
||
break;
|
||
}
|
||
}//end of Jig
|
||
if (bExit)
|
||
{
|
||
if (pIndex)
|
||
{
|
||
delete pIndex;
|
||
}
|
||
break;
|
||
}
|
||
}//end of true
|
||
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
{
|
||
dlg.DestroyWindow();
|
||
}
|
||
|
||
}
|
||
|
||
void DBL_AEC_SUOYINTUMING()
|
||
{
|
||
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_SUOYINTUMING"), id);
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbDrawingIndex, pIndex);
|
||
if (pIndex == NULL) return;
|
||
|
||
//模态对话框 add by lxb on 2011/12/21
|
||
CDrawingIndexDlg dlg(acedGetAcadFrame());
|
||
dlg.Obj2Dlg(pIndex);
|
||
if (dlg.DoModal() == IDOK)
|
||
{
|
||
if (pIndex->upgradeOpen() == Acad::eOk)
|
||
{
|
||
double dTextHight = 0;
|
||
BOOL bDrawScale = false;
|
||
XString sDrawingLabel(_T("")), sIndexLabel(_T("")), sTextStyle(_T("")), sScaleText(_T(""));
|
||
|
||
//add by lgy 20120111 添加比例文字样式
|
||
XString sScaleStyle(_T(""));
|
||
|
||
dTextHight = dlg.GetTextHight();
|
||
bDrawScale = dlg.IsDrawScale();
|
||
sDrawingLabel = dlg.GetDrawingLabel();
|
||
sIndexLabel = dlg.GetIndexLabel();
|
||
sTextStyle = dlg.GetTextStyle();
|
||
|
||
//add by lgy 20120111 获得比例文字样式字符串
|
||
sScaleStyle = dlg.GetScaleStyle();
|
||
|
||
sScaleText = dlg.GetScaleText();
|
||
|
||
AcDbObjectId idTextStyle = InitTextStyle(sTextStyle);
|
||
|
||
//add by lgy 20120111 获得比例文字样式字符串
|
||
AcDbObjectId idScaleStyle = InitTextStyle(sScaleStyle);
|
||
|
||
//修改属性
|
||
if ((sDrawingLabel == _T("-")))
|
||
{
|
||
sDrawingLabel = _T("");
|
||
}
|
||
pIndex->SetDrawingLabel(sDrawingLabel); //图号
|
||
pIndex->SetIndexLabel(sIndexLabel); //编号
|
||
pIndex->SetTextStyleId(idTextStyle); //文字样式
|
||
|
||
//modify by lgy 20120111 设置比例文字样式
|
||
//pIndex->SetScaleStyleId(idTextStyle);
|
||
pIndex->SetScaleStyleId(idScaleStyle);
|
||
|
||
pIndex->SetScaleTextHeight(dTextHight); //字高
|
||
pIndex->SetDrawScale(bDrawScale); //是否画比例
|
||
pIndex->SetScaleText(sScaleText); //比例内容
|
||
|
||
pIndex->downgradeOpen();
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
extern BOOL g_bIndexDimFixAngle;
|
||
extern CString g_sIndexDimFixAngle;
|
||
XPoint pptfirst_; // [11/12/2007 nsh]
|
||
double sAngle_;
|
||
// Modify by lcf on 2005/06/24
|
||
void SymbIndexPointer()
|
||
{
|
||
AcDbObjectId idTextStyle = InitTextStyle(TS_LABEL); // 圆圈文字样式
|
||
// sg modify 120106,给“TS_DRAWINGNAME”独立出来一个文字样式
|
||
// AcDbObjectId idDimStyle = InitTextStyle(TS_DIM); // 标注文字样式
|
||
AcDbObjectId idDimStyle = InitTextStyle(TS_SYMBOL); // 线上文字样式
|
||
if (!idTextStyle)
|
||
return;
|
||
|
||
CIndexDimDlg dlg(FALSE, acedGetAcadFrame());
|
||
//注释 by lgy 20120111 命令启动要求记录上次命令设置的文字样式
|
||
//dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle);
|
||
//dlg.m_strDimStyle = (LPCTSTR)GetSymbolName(idDimStyle); // lgh add 20101216 ,标注文字样式
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
||
return;
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
AecXDbSymbIndexPointer ent; // 索引符号
|
||
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
//ent.setLayer(ent.GetDefaultLayer());
|
||
ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
ent.SetTextBaseLen(ent.GetDefaultTextBaseLen()); // 默认为6.0*出图比例
|
||
ent.m_bInJig = true;
|
||
|
||
XPoint ptDim;
|
||
while (ads_getpoint(NULL, _T("\n请给出索引节点的位置<退出>: "), ptDim) == RTNORM)
|
||
{
|
||
pptfirst_ = ptDim; // [11/12/2007 nsh],固定角度使用
|
||
ptDim = GlobalFunc::Ucs2Wcs(ptDim);
|
||
ent.SetStartPoint(ptDim); // 起点
|
||
ent.ClearCutLine();
|
||
ent.ClearAddedPoint();
|
||
dlg.UpdateVisible(FALSE); // 索引符号类型,不可改
|
||
dlg.Dlg2Obj(&ent);
|
||
dlg.m_bPost = TRUE;
|
||
dlg.SetSectRunView(FALSE);
|
||
|
||
IndexPointerEdJig jig(&ent);
|
||
jig.AttachDlg(&dlg);
|
||
jig.SetKeyword(_T("`")); // 屏幕取字高、词
|
||
int nRet = RTNORM;
|
||
if (ent.IsIndexPointer()) // 指向索引
|
||
{
|
||
if (!dlg.m_bAddIndex) // sg modify 090429,支持钩选不添加索引范围
|
||
ent.SetSourceExtent(0.0);
|
||
else
|
||
{
|
||
dlg.SetSourceExtentVisible(FALSE); // sg add 090416,是否添加索引范围,不可改
|
||
jig.SetPrompt(_T("\n请给出索引节点的范围<0.0>: "));
|
||
jig.SetOperCode(IndexPointerEdJig::kSourceExtent);
|
||
while (1)
|
||
{
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNONE)
|
||
{
|
||
ent.SetSourceExtent(0.0);
|
||
break;
|
||
}
|
||
else if (nRet == RTNORM)
|
||
break;
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0) // 屏幕拾取字高
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText(); // 屏幕拾取文字
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else // 剖切索引
|
||
ent.SetSourceExtent(AecXDbSymbIndexPointer::GetDefaultCutLineLen());
|
||
dlg.SetSourceExtentVisible(FALSE); // sg add 090416,是否添加索引范围,不可改
|
||
|
||
// 把这两个数据初始一下。
|
||
if (dlg.m_bAddTurn && !ent.IsIndexPointer())
|
||
{
|
||
ent.SetAddedPoint(ent.GetStartPoint());
|
||
}
|
||
|
||
ent.SetTurnPoint(ent.GetStartPoint());
|
||
|
||
if (dlg.m_bAddTurn && !ent.IsIndexPointer())
|
||
{ //剖切索引,并且需要绘制两个转折点
|
||
jig.SetPrompt(_T("\n请给出转折点位置<退出>:"));
|
||
jig.SetOperCode(IndexPointerEdJig::kAddedTurn);
|
||
|
||
while (1)
|
||
{
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
break;
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0) // 屏幕拾取字高
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText(); // 屏幕拾取文字
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
jig.SetPrompt(_T("\n请给出转折点位置<退出>:"));
|
||
jig.SetOperCode(IndexPointerEdJig::kTurnPoint);
|
||
while (1)
|
||
{
|
||
if (!dlg.m_bFixAngle) // 不固定角度
|
||
{
|
||
jig.m_bFixAngle = FALSE;
|
||
}
|
||
else // 固定角度
|
||
{
|
||
jig.m_bFixAngle = TRUE;
|
||
jig.m_dFixAngle = _tstof(LPCTSTR(dlg.m_sFixAngle));
|
||
sAngle_ = _tstof(LPCTSTR(dlg.m_sFixAngle)); // [11/12/2007 nsh]
|
||
}
|
||
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
break;
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0) // 屏幕拾取字高
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1) // 屏幕拾取文字
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
jig.SetPrompt(_T("\n请给出文字索引号位置<退出>:"));
|
||
jig.SetOperCode(IndexPointerEdJig::kTextBasePoint);
|
||
while (1)
|
||
{
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
if (!ent.IsIndexPointer())
|
||
{
|
||
jig.SetPrompt(_T("\n请给出剖视方向<当前>:"));
|
||
jig.SetOperCode(IndexPointerEdJig::kViewDirection);
|
||
while (1)
|
||
{
|
||
int nRet1 = jig.DoIt();
|
||
if (nRet1 == RTNORM)
|
||
break;
|
||
else if (nRet1 == RTNONE)
|
||
{
|
||
dlg.Dlg2Obj(&ent);
|
||
break;
|
||
}
|
||
else if (nRet1 == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
if (nRet != RTNORM && nRet != RTNONE)
|
||
return;
|
||
}
|
||
break;
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0) // 屏幕拾取字高
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1) // 屏幕拾取文字
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
// lgh add 101217,设置多个剖切线位置
|
||
if (!ent.IsIndexPointer() && dlg.m_bMoreCut)
|
||
{ // 多个剖切线
|
||
jig.SetPrompt(_T("\n请给出其它剖切线位置: "));
|
||
jig.SetOperCode(IndexPointerEdJig::kMoreCuts);
|
||
|
||
while (1)
|
||
{
|
||
nRet = jig.DoIt();
|
||
if (nRet == RTNORM)
|
||
{// 继续添加剖切线
|
||
// continue
|
||
}
|
||
else if (nRet == RTCAN)
|
||
{ // 退出
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0) // 屏幕拾取字高
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText(); // 屏幕拾取文字
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
|
||
else
|
||
{ // 结束添加剖切线,
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
dlg.UpdateData();
|
||
|
||
// modify by xly on 100915 实体是否设置在默认层
|
||
//((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue);
|
||
ent.m_bInJig = false;
|
||
GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbIndexPointer *)ent.clone());
|
||
ent.m_bInJig = true;
|
||
dlg.AddToRecent();
|
||
|
||
if (!dlg.m_bContinue) // 是否连续标注
|
||
break;
|
||
dlg.UpdateVisible(TRUE);
|
||
dlg.SetSectRunView(TRUE);// lgh add 101223, 设置剖切对话框窗口
|
||
dlg.SetSourceExtentVisible(TRUE); // sg add 090416,是否添加索引范围,可见
|
||
dlg.m_bPost = FALSE;
|
||
}
|
||
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
{
|
||
g_sIndexDimFixAngle = dlg.m_sFixAngle;
|
||
g_bIndexDimFixAngle = dlg.m_bFixAngle;
|
||
dlg.DestroyWindow();
|
||
}
|
||
}
|
||
|
||
void DBL_AEC_SUOYINFUHAO()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_SUOYINFUHAO"), id);
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbIndexPointer, pIndex);
|
||
if (!pIndex) return;
|
||
|
||
CEditIndexDimDlg dlg(acedGetAcadFrame());
|
||
dlg.Obj2Dlg(pIndex);
|
||
dlg.AttachObject(pIndex);
|
||
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (dlg.DoModal() != IDOK) return;
|
||
}
|
||
|
||
if (pIndex->upgradeOpen() == Acad::eOk)
|
||
{
|
||
dlg.Dlg2Obj(pIndex);
|
||
dlg.AdjustExtentProp();
|
||
pIndex->downgradeOpen();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
void SymbComposing()
|
||
{
|
||
// sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式
|
||
// AcDbObjectId idTextStyle = InitTextStyle(TS_DIM);
|
||
AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL);
|
||
if (!idTextStyle)
|
||
return;
|
||
|
||
CComposingDlg dlg(acedGetAcadFrame());
|
||
//注释 by lgy 20120111 文字样式具有记忆功能
|
||
//dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle);
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (!dlg.Create(dlg.IDD, acedGetAcadFrame()))
|
||
return;
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
AecXDbSymbComposing ent;
|
||
// delete by xly on 100915 实体图层设置放在AddToSpace中
|
||
//ent.setLayer(ent.GetDefaultLayer());
|
||
ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
|
||
ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
||
// ent.SetTextBaseLen(ent.GetDefaultTextBaseLen());
|
||
ent.SetTextBaseLen(30); // modified by whl on 060210
|
||
|
||
// delete by xly on 100917 不干涉用户捕捉
|
||
//XPushVar<int> vOrthoMode(_T("ORTHOMODE"), 1); // sg add 080918,强制打开正交
|
||
XPoint ptDim;
|
||
while (ads_getpoint(NULL, _T("\n请给出标注第一点<退出>: "), ptDim) == RTNORM)
|
||
{
|
||
ptDim = GlobalFunc::Ucs2Wcs(ptDim);
|
||
ent.SetStartPoint(ptDim);
|
||
ent.SetTurnPoint(ptDim);
|
||
dlg.Dlg2Obj(&ent);
|
||
dlg.m_bPost = TRUE;
|
||
|
||
// add by xly on 100916 有原点时,第一部操作结束,圆点标签不可用
|
||
if (dlg.m_bHasCirPoint)
|
||
{
|
||
dlg.SetLableEnable(!dlg.m_bHasCirPoint);
|
||
}
|
||
|
||
ComposingEdJig jig(&ent);
|
||
jig.SetKeyword(_T("`"));
|
||
|
||
// modify by xly on 100916 根据8.5需求更改提示语
|
||
//jig.SetPrompt(_T("\n请给出标注第二点<退出>:"));
|
||
jig.SetPrompt(_T("\n请给出文字基线位置<退出>:"));
|
||
jig.SetOperCode(ComposingEdJig::kTurnPoint);
|
||
while (1)
|
||
{
|
||
int nRet1 = jig.DoIt();
|
||
if (nRet1 == RTNORM)
|
||
break;
|
||
else if (nRet1 == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
|
||
// modify by xly on 100916 根据8.5需求更改提示语
|
||
//jig.SetPrompt(_T("\n请给出文字线方向和长度<退出>:"));
|
||
jig.SetPrompt(_T("\n请给出文字基线方向和长度<退出>:"));
|
||
jig.SetOperCode(ComposingEdJig::kTextLine);
|
||
while (1)
|
||
{
|
||
int nRet2 = jig.DoIt();
|
||
if (nRet2 == RTNORM)
|
||
break;
|
||
else if (nRet2 == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
return;
|
||
}
|
||
}
|
||
// modify by xly on 100915 实体是否设置在默认层
|
||
//((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue);
|
||
AcDbObjectId newId = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbComposing *)ent.clone());
|
||
|
||
// add by xly 0n 100916 如果有圆点标注
|
||
/////////////////////////////////////Start/////////////////////////////////////////
|
||
if (!dlg.m_bHasCirPoint)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 打开已经存在的做法标注
|
||
OPENOBJ_BEGIN(newId, AcDb::kForRead, AecXDbSymbComposing, pComposing);
|
||
if (pComposing != NULL)
|
||
{
|
||
AcGePoint3d ptBase = pComposing->GetTurnPoint();
|
||
|
||
// 反复提示“请输入其他标注点<结束>”添加标注点
|
||
while (1)
|
||
{
|
||
// add by xly on 101221 及时更新对象数据
|
||
if (pComposing->upgradeOpen() == Acad::eOk)
|
||
{
|
||
dlg.Dlg2Obj(pComposing);
|
||
pComposing->downgradeOpen();
|
||
}
|
||
|
||
// jig
|
||
// modify by xly on 110314 支持用户坐标系
|
||
//TComposingAddOtherPtJig jig2(Ucs2Wcs(ptDim),ptBase);
|
||
ComposingAddOtherPtJig jig2(ptDim, ptBase);
|
||
jig2.SetPrompt(_T("\n请输入其他标注点<结束>:"));
|
||
jig2.SetKeyword(_T("`"));
|
||
|
||
XPoint ptNew;
|
||
int nRet = jig2.DoIt();
|
||
if (nRet == RTNORM)
|
||
{
|
||
// 将其他标注点添加到实体中
|
||
ptNew = jig2.GetPickPoint();
|
||
AcGePoint3d ptS = pComposing->GetStartPoint(),
|
||
ptTurn = pComposing->GetTurnPoint();
|
||
|
||
// 引线长度
|
||
double dLineLen = ptS.distanceTo(ptTurn);
|
||
|
||
// 新进入点的长度
|
||
double dNewLineLen = ptNew.Distance(ptTurn);
|
||
|
||
if (pComposing->upgradeOpen() == Acad::eOk)
|
||
{
|
||
// 新进入点的长度大于引线长度,更新m_ptStart
|
||
if (dLineLen < dNewLineLen)
|
||
{
|
||
pComposing->SetStartPoint(ptNew);
|
||
pComposing->AddDotLoc(ptS);
|
||
}
|
||
else
|
||
{
|
||
pComposing->AddDotLoc(ptNew);
|
||
}
|
||
pComposing->downgradeOpen();
|
||
}
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
if (dlg.m_nOperCode == 0)
|
||
dlg.GetTextHeight();
|
||
else if (dlg.m_nOperCode == 1)
|
||
dlg.GetPickText();
|
||
dlg.Dlg2Obj(&ent);
|
||
}
|
||
else if (nRet == RTNONE)
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
{
|
||
dlg.DestroyWindow();
|
||
}
|
||
return;
|
||
}
|
||
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
/////////////////////////////////////End/////////////////////////////////////////
|
||
|
||
if (!dlg.m_bContinue)
|
||
break;
|
||
dlg.m_bPost = FALSE;
|
||
|
||
// add by xly on 100916 恢复对话框标签显示
|
||
dlg.SetLableEnable(TRUE);
|
||
}
|
||
if (::IsWindow(dlg.m_hWnd))
|
||
dlg.DestroyWindow();
|
||
}
|
||
|
||
int DBL_AEC_CHICUNBIAOZHU(AcDbObjectId id)
|
||
{
|
||
AcAxDocLock lock;
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecDbDimension, pDim);
|
||
if (pDim!=NULL)
|
||
{
|
||
XPoint ptBase = GlobalFunc::Wcs2Ucs(pDim->GetLocation());
|
||
int nRet;
|
||
XPoint ptAdd;
|
||
XString szPrompt;
|
||
XPointList lstAddPoint, lstBasePoint;
|
||
lstBasePoint.Append(new XPoint(ptBase));
|
||
while (1)
|
||
{
|
||
int nLen = lstAddPoint.Length();
|
||
if (nLen == 0)
|
||
_stprintf(szPrompt, _T("\n点取待增补的标注点的位置或 [参考点(R)]<退出>:"));
|
||
else
|
||
_stprintf(szPrompt, _T("\n点取待增补的标注点的位置或 [参考点(R)/撤消上一标注点(U)]<退出>:"));
|
||
|
||
INITGET_BEG(0, _T("U R"));
|
||
nRet = acedGetPoint(ptBase, szPrompt, ptAdd);
|
||
INITGET_END();
|
||
if (nRet == RTNORM)
|
||
{
|
||
ptBase = ptAdd;
|
||
ptAdd = GlobalFunc::Ucs2Wcs(ptAdd);
|
||
if (pDim->upgradeOpen() == Acad::eOk)
|
||
{
|
||
if (!pDim->AddSegment(ptAdd))
|
||
g_Option::instance().adsout << _T("\n点取位置不合适!");
|
||
else
|
||
{
|
||
lstAddPoint.Append(new XPoint(ptAdd));
|
||
lstBasePoint.Append(new XPoint(ptBase));
|
||
if (g_Option::instance().g_nDimAdjust)//add by whl on 050530
|
||
pDim->AdjustDim(g_Option::instance().g_nDimAdjust!=2);
|
||
}
|
||
pDim->downgradeOpen();
|
||
}
|
||
}
|
||
else if (nRet == RTKWORD)
|
||
{
|
||
XString sKey;
|
||
acedGetInput(sKey);
|
||
if (sKey[0] == _T('R'))
|
||
acedGetPoint(NULL, _T("\n参考点:"), ptBase);
|
||
else if (sKey[0] == _T('U'))
|
||
{
|
||
if (pDim->upgradeOpen() == Acad::eOk)
|
||
{
|
||
if (nLen > 0)
|
||
{
|
||
ptAdd = *lstAddPoint.Tail();
|
||
lstAddPoint.Remove(nLen-1);
|
||
pDim->HitTestOnPoint(ptAdd);
|
||
pDim->FindAndRemoveSegment(ptAdd);
|
||
lstBasePoint.Remove(nLen);
|
||
ptBase = *lstBasePoint.Tail();
|
||
}
|
||
pDim->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
return RTNORM;
|
||
}
|
||
|
||
|
||
void DBL_AEC_ZUOFABIAOZHU()
|
||
{
|
||
AcDbObjectId id;
|
||
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_ZUOFABIAOZHU"), id);
|
||
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbComposing, pComposing);
|
||
if (pComposing == NULL)
|
||
return;
|
||
|
||
|
||
BOOL bOldIsSide = pComposing->IsSideText(); // 记录旧位置,sg add 081007
|
||
|
||
CComposingDlg dlg(acedGetAcadFrame());
|
||
dlg.Obj2Dlg(pComposing);
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (dlg.DoModal() != IDOK)
|
||
return;
|
||
}
|
||
if (pComposing->upgradeOpen() == Acad::eOk)
|
||
{
|
||
double dNewLineLen = pComposing->GetTextBaseLen(TRUE), // sg modify 081112
|
||
dPageWidth = pComposing->GetPageWidth(TRUE);
|
||
|
||
dlg.Dlg2Obj(pComposing);
|
||
|
||
BOOL bNewIsSide = pComposing->IsSideText(); // 记录新位置,sg add 081007
|
||
if (bOldIsSide && !bNewIsSide) // “文字在线端”改为“文字在线上”
|
||
{
|
||
double dDist2Line = pComposing->GetDist2Line(TRUE, TRUE);
|
||
dNewLineLen = dPageWidth + 2 * dDist2Line; // 新线长=页宽+起始距线距离
|
||
pComposing->SetPageWidth(dPageWidth, TRUE);
|
||
}
|
||
else if (!bOldIsSide && bNewIsSide) // “文字在线上”改为“文字在线端”
|
||
{
|
||
dNewLineLen = pComposing->GetTextHeight(); // 新线长=字高
|
||
double dOldLineLen = pComposing->GetTextBaseLen(TRUE);
|
||
dNewLineLen *= dOldLineLen / fabs(dOldLineLen);
|
||
}
|
||
pComposing->SetTextBaseLen(dNewLineLen, TRUE);
|
||
pComposing->SetAlignBySymbol(); // 设置对齐方式,sg add 081104
|
||
pComposing->downgradeOpen();
|
||
}
|
||
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
void DI_XGBL()
|
||
{
|
||
CModifyDimDlg::start();
|
||
}
|
||
|
||
void DI_CCZH()
|
||
{
|
||
//RBList rbMaskDim(RTDXF0, _T("AEC_DUICHENZHOU,AEC_POQIE,AEC_SUOYINTUMING,AEC_SUOYINFUHAO,AEC_ZUOFABIAOZHU,AEC_YINCHUBIAOZU,AEC_TUMINGBIAOZHU,AEC_ZHEDUANXIAN,AEC_ZHIBEIZHEN,AEC_CHICUNBIAOZHU,AEC_ZUOBIAOBIAOZHU,AEC_BIAOGAOBIAOZHU,AEC_JIANTOUYINZHU,"), NULL);
|
||
|
||
if (AfxMessageBox(_T("是否将图中所有“尺寸标注”转换为AutoCAD的原生标注?此过程不可逆!"), MB_YESNO) != IDYES) return;
|
||
|
||
ads_name ss, ent;
|
||
struct resbuf *pRb = acutBuildList(RTDXF0, _T("AEC_CHICUNBIAOZHU"), 0);
|
||
acedSSGet(_T("A"), NULL, NULL, pRb, ss);
|
||
|
||
Adesk::Int32 nLen = 0;
|
||
acedSSLength(ss, &nLen);
|
||
AcDbVoidPtrArray ar;
|
||
AcDbObjectId id, idStyle;
|
||
for (int i(0); i < nLen; ++i)
|
||
{
|
||
acedSSName(ss, i, ent);
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AecDbDimension, pDim)
|
||
if (pDim)
|
||
{
|
||
pDim->explode(ar);
|
||
for (int i(0); i < ar.length(); ++i)
|
||
{
|
||
id = GlobalFunc::AddToModelSpace((AcDbDimension *)ar[i]);
|
||
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbDimension, pCadDim)
|
||
if (pCadDim)
|
||
idStyle = pCadDim->dimensionStyle();
|
||
OPENOBJ_END()
|
||
|
||
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbDimension, pCadDim)
|
||
if (pCadDim && idStyle.isValid())
|
||
pCadDim->setDimensionStyle(idStyle);
|
||
OPENOBJ_END()
|
||
}
|
||
|
||
pDim->erase();
|
||
}
|
||
OPENOBJ_END()
|
||
}
|
||
|
||
acedSSFree(ss);
|
||
acutRelRb(pRb);
|
||
}
|
||
|
||
void GetDisadvantage2Head(PickSet &ssTmp, SSearchPipeList *pDisadvantage)
|
||
{
|
||
AcDbObjectId id = NULL;
|
||
id = pDisadvantage->m_ID;
|
||
if (pDisadvantage->m_iType == 0)
|
||
ssTmp += id;
|
||
if (pDisadvantage->m_pPrevious != NULL)
|
||
GetDisadvantage2Head(ssTmp, pDisadvantage->m_pPrevious);
|
||
}
|
||
|
||
SSearchPipeList *GetDisadvantageNode(SSearchPipeList *pListAll, SSearchPipeList *pDisadvantage)
|
||
{
|
||
AcDbObjectId id = NULL;
|
||
id = pListAll->m_ID;
|
||
double nCurPipeLength(0);
|
||
nCurPipeLength = pListAll->m_nLength;
|
||
if (GlobalFunc::IsSprinkler(id)) {
|
||
if (!pDisadvantage || (pDisadvantage && nCurPipeLength > pDisadvantage->m_nLength))
|
||
pDisadvantage = pListAll;
|
||
}
|
||
int len = pListAll->m_lstNode.Length();
|
||
for (long i = 0; i<len; i++) {
|
||
SSearchPipeList *pList = pListAll->m_lstNode[i];
|
||
pDisadvantage = GetDisadvantageNode(pList, pDisadvantage);
|
||
}
|
||
return pDisadvantage;
|
||
}
|
||
|
||
void FindLongPath()
|
||
{
|
||
RBList rbMaskPipe = ads_buildlist(-4, _T("<or"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_SPRINKLE, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_SPRINKLE2, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_SPRINKLE3, -4, _T("and>"),
|
||
-4, _T("or>"), NULL);
|
||
|
||
Entity entMain;
|
||
PickSet ss(SS_FREE);
|
||
if (GlobalFunc::SelectEntity(_T("\n请选择主干管(搜索指定干管所连最远路径):<指定范围搜索>"), entMain, rbMaskPipe) == RTNORM)
|
||
{
|
||
ss += entMain;
|
||
}
|
||
else
|
||
{
|
||
PickSet ssAllDwg(SS_FREE);
|
||
// ZXL 2013.11.15 ADD
|
||
RBList rbMaskAllPipe = ads_buildlist(-4, _T("<or"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_SPRINKLE, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_SPRINKLE2, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_PIPE_SPRINKLE3, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_VPIPE_SPRINKLE, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_VPIPE_SPRINKLE2, -4, _T("and>"),
|
||
-4, _T("<and"), RTDXF0, _T("AEC_ZT_PIPE"), 8, LAY_VPIPE_SPRINKLE3, -4, _T("and>"),
|
||
-4, _T("or>"), NULL);
|
||
|
||
if (GlobalFunc::SelectEntities(_T("\n请选择搜索范围:<整图搜索>"), ssAllDwg, rbMaskAllPipe) != RTNORM)
|
||
ssAllDwg.Get(_T("X"), NULL, NULL, rbMaskAllPipe);
|
||
int len = ssAllDwg.Length();
|
||
//仅仅要连1根直管的立管,排除扣弯
|
||
for (long i = 0; i<len; i++) {
|
||
Entity ent = ssAllDwg[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, CDbPipe, pPipe);
|
||
if (pPipe && pPipe->IsVertical()) {
|
||
AcDbObjectId id1 = pPipe->GetNode(0);
|
||
AcDbObjectId id2 = pPipe->GetNode(1);
|
||
int count(0);
|
||
OPENOBJ_BEGIN(id1, AcDb::kForRead, CDbPipeNode, pNode);
|
||
if (pNode) {
|
||
int num = pNode->GetInterfaceNum();
|
||
if (num == 1)
|
||
count++;
|
||
}
|
||
OPENOBJ_END();
|
||
OPENOBJ_BEGIN(id2, AcDb::kForRead, CDbPipeNode, pNode);
|
||
if (pNode) {
|
||
int num = pNode->GetInterfaceNum();
|
||
if (num == 1)
|
||
count++;
|
||
}
|
||
OPENOBJ_END();
|
||
XPoint ptTmp1 = pPipe->StartPoint();
|
||
ptTmp1.z = 0;
|
||
if (count == 1) {
|
||
BOOL bFlag = TRUE;
|
||
for (long j = 0; j<ss.Length(); j++) {
|
||
Entity entTmp = ss[j];
|
||
XPoint pt1, pt2;
|
||
GlobalFunc::GetPipePoint(entTmp, pt1, pt2);
|
||
pt1.z = 0;
|
||
if (ptTmp1 == pt1) {
|
||
bFlag = FALSE;
|
||
break;
|
||
}
|
||
}
|
||
if (bFlag)
|
||
ss += ent;
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
len = ss.Length();
|
||
g_Option::instance().adsout << XString(_T("\n共%d根立管!"), len);
|
||
}
|
||
PickSet ssLong(SS_FREE);
|
||
double nLongDist(0);
|
||
acedSetStatusBarProgressMeter(_T("计算中..."), 0, ss.Length());
|
||
|
||
for (long j = 0; j<ss.Length(); j++) {
|
||
acedSetStatusBarProgressMeterPos(j);
|
||
|
||
|
||
Entity entTmp = ss[j];
|
||
SSearchPipeList *pListAll = new SSearchPipeList();
|
||
PickSet ssAll(SS_FREE);
|
||
ssAll += entTmp;
|
||
if (!GlobalFunc::SearchSprinkPipeSys(entTmp, NULL, pListAll, ssAll)) {
|
||
AfxMessageBox(_T("喷淋系统有回路!"));
|
||
delete pListAll;
|
||
break;
|
||
}
|
||
if (!GlobalFunc::CalcLstPipeLength(pListAll, NULL, ssAll)) {
|
||
AfxMessageBox(_T("喷淋系统没有标注管径,请先执行命令[喷淋管径]或[管径标注]"));
|
||
delete pListAll;
|
||
break;
|
||
}
|
||
SSearchPipeList *pDisadvantage = NULL;
|
||
pDisadvantage = GetDisadvantageNode(pListAll, NULL);
|
||
|
||
if (pDisadvantage) {
|
||
PickSet ssTmp(SS_FREE);
|
||
GetDisadvantage2Head(ssTmp, pDisadvantage);
|
||
double nDist(0);
|
||
for (long m = 0; m<ssTmp.Length(); m++) {
|
||
Entity entPipe = ssTmp[m];
|
||
OPENOBJ_BEGIN(entPipe, AcDb::kForRead, CDbPipe, pPipe);
|
||
if (pPipe) {
|
||
nDist += pPipe->Length();
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
if (nDist > nLongDist) {
|
||
ssLong.Free();
|
||
nLongDist = nDist;
|
||
ssLong += ssTmp;
|
||
}
|
||
}
|
||
|
||
delete pListAll;
|
||
}
|
||
|
||
acedRestoreStatusBar();
|
||
|
||
g_Option::instance().adsout << XString(_T("\n立管距最不利点距离:%.2f!"), nLongDist);
|
||
ads_sssetfirst(ssLong, ssLong);
|
||
int len2 = ssLong.Length();
|
||
if (len2 < 1)
|
||
return;
|
||
XPoint ptCen, ptLow, ptUp;
|
||
double x, y, z;
|
||
ssLong.GetExtend(ptCen, &x, &y, &z);
|
||
ptLow = ptUp = ptCen;
|
||
ptLow.x -= x;
|
||
ptLow.y -= y;
|
||
ptUp.x += x;
|
||
ptUp.y += y;
|
||
GlobalFunc::AssureInCurrentView(ptLow, ptUp);
|
||
}
|
||
|
||
void DBL_AEC_ZT_EQUIPMENT()
|
||
{
|
||
AcDbObjectId id;
|
||
if (!GetDoubleClickEnt(_T("DBL_AEC_ZT_EQUIPMENT"), id)) return;
|
||
if (GlobalFunc::IsSprinkler(id))
|
||
{
|
||
extern int EditSprinkler(AcDbObjectId id);
|
||
EditSprinkler(id);
|
||
return;
|
||
}
|
||
if (GlobalFunc::IsHydrant(id))
|
||
{
|
||
extern int EditHydrant(AcDbObjectId id);
|
||
EditHydrant(id);
|
||
return;
|
||
}
|
||
}
|
||
|
||
void DBL_AEC_ZT_FIRE_EXTINGUISHER()
|
||
{
|
||
AcDbObjectId id;
|
||
if (!GetDoubleClickEnt(_T("DBL_AEC_ZT_FIRE_EXTINGUISHER"), id)) return;
|
||
extern int EditFireExtinguisher(AcDbObjectId id);
|
||
EditFireExtinguisher(id);
|
||
}
|