Files
envi-code/SourceCode/Code2026/Dimension/command.cpp
T
2026-09-28 15:28:50 +08:00

4329 lines
110 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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);
}