6673 lines
161 KiB
C++
6673 lines
161 KiB
C++
#include "stdafx.h"
|
||
#include "resource.h"
|
||
#include "DimAxisLabelDlg.h"
|
||
#include "axisdim.h"
|
||
#include "geassign.h"
|
||
#include "TDragPickEntSet.h"
|
||
#include <afxtempl.h>
|
||
#include "EdJigEx.h"
|
||
//#include "AxisNoParser.h"
|
||
|
||
#include "ManualDimAxisDlg.h"
|
||
// 逐点轴标命令中,多轴号不连续文字部分的文字高度
|
||
#define AXISTEXT_HEIGHT 5.5
|
||
|
||
extern GEOAPI int GetClipBoundary(XPoly2D &poly2d);
|
||
// extern GEOAPI int XGetCorner(const XPoint &ptCorn1, const TCHAR *pszMsg, XPoint &ptCorn2);
|
||
static XPoint g_ptDragCenter;
|
||
static ads_real g_nOldRadius;
|
||
static ads_real g_nOldAngle = 0.0;
|
||
|
||
int ComputDist(AcGePoint3d ptStart1,AcGePoint3d ptEnd1,AcGePoint3d ptStart2,AcGePoint3d ptEnd2,BOOL bDim=FALSE);
|
||
void AlignAxis(PickSet ss);
|
||
void AlignLine(PickSet ss,Entity ent);
|
||
// BOOL RemoveDupLine(PickSet ss,BOOL bDim=FALSE);
|
||
|
||
class TAxisLabelEdJig : public TSymbEdJig
|
||
{
|
||
public:
|
||
TAxisLabelEdJig(TDbAxisLabelSet *);
|
||
virtual int DoIt(int *pKeyIndex=NULL);
|
||
DragStatus GetPoint(XPoint &pt);
|
||
|
||
protected:
|
||
virtual Adesk::Boolean update();
|
||
virtual AcDbEntity* entity() const;
|
||
|
||
private:
|
||
// I/O
|
||
TDbAxisLabelSet *m_pDrawEnt;
|
||
};
|
||
|
||
TAxisLabelEdJig::TAxisLabelEdJig(TDbAxisLabelSet *pElev)
|
||
{
|
||
m_pDrawEnt=pElev;
|
||
}
|
||
|
||
AcEdJig::DragStatus TAxisLabelEdJig::GetPoint(XPoint &pt)
|
||
{
|
||
XCurveSegment seg=m_pDrawEnt->GetAxis(0);
|
||
XPoint ptBase=seg.StartPoint();
|
||
|
||
return acquirePoint(pt, ptBase);
|
||
}
|
||
|
||
// 开始执行拖动
|
||
int TAxisLabelEdJig::DoIt(int *keyIndex)
|
||
{
|
||
XCurveSegment seg=m_pDrawEnt->GetAxis(0);
|
||
ads_polar(seg.StartPoint(), seg.IDirection(0)+PI, seg.GetLength(), m_ptResult);
|
||
int nRet = TSymbEdJig::DoIt(keyIndex);
|
||
|
||
return nRet;
|
||
}
|
||
|
||
// 更新实体数据
|
||
Adesk::Boolean TAxisLabelEdJig::update()
|
||
{
|
||
XDirectionCurve cv=m_pDrawEnt->GetOrthoCurve(0);
|
||
XCurveSegment segFirst=m_pDrawEnt->GetAxis(0);
|
||
double nSide=cv.OnWhichSide(m_ptResult);
|
||
if (nSide == cv.OnWhichSide(segFirst.EndPoint()))
|
||
{
|
||
double nDir=segFirst.IDirection(0);
|
||
ads_polar(segFirst.StartPoint(), nDir+PI, 100.0, segFirst.EndPoint());
|
||
m_pDrawEnt->SetFirstSegment(segFirst);
|
||
m_pDrawEnt->NegateParams();
|
||
}
|
||
m_pDrawEnt->SetLeaderLen(0, m_ptResult.Distance2d(segFirst.StartPoint()), FALSE);
|
||
m_pDrawEnt->SetLeaderLen(1, m_ptResult.Distance2d(segFirst.StartPoint()), FALSE);
|
||
|
||
return Adesk::kTrue;
|
||
}
|
||
|
||
AcDbEntity* TAxisLabelEdJig::entity() const
|
||
{
|
||
return (AcDbEntity *)m_pDrawEnt;
|
||
}
|
||
|
||
static int DragArcOrCircle(ads_point pt, ads_matrix mt)
|
||
{
|
||
assert(g_nOldRadius>1.0E-9);
|
||
ads_real nScale = ads_distance(Ucs2Wcs(g_ptDragCenter), Ucs2Wcs(pt))/g_nOldRadius;
|
||
Ucs2Wcs(g_ptDragCenter).GetScaleMatrix(nScale, mt);
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
static int DragRotationAction(ads_point pt, ads_matrix mt)
|
||
{
|
||
ads_real nRot=CT_std_angle(ads_angle(Ucs2Wcs(g_ptDragCenter), Ucs2Wcs(pt))-g_nOldAngle);
|
||
Ucs2Wcs(g_ptDragCenter).GetRotationMatrix(nRot, mt);
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
|
||
|
||
// [2010-4-20 wubo] 设置所有的轴标实体为显示隐藏
|
||
// 成功返回true,否则返回false
|
||
bool SetShowHiddenAxisLable(bool bShow)
|
||
{
|
||
TPickEntSet ssAxisLabelSet(SS_FREE);
|
||
if (ssAxisLabelSet.Get(_T("A"), NULL, NULL, TRBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) == RTNORM)
|
||
{
|
||
long lLength = ssAxisLabelSet.Length();
|
||
for (long i = 0; i < lLength; i++)
|
||
{
|
||
OPENOBJ_BEGIN(ssAxisLabelSet[i], AcDb::kForWrite, TDbAxisLabelSet, pAxisLabelSet);
|
||
if (pAxisLabelSet == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
pAxisLabelSet->SetShowHide(bShow);
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// ptPick--UCS
|
||
int DragRadius(const Entity &e, const TCHAR *pszPrompt, const XPoint &ptPick)
|
||
{
|
||
Entity ent=e;
|
||
ent.GetData(10, &g_ptDragCenter);
|
||
ent.GetData(40, &g_nOldRadius);
|
||
g_ptDragCenter=Wcs2Ucs(g_ptDragCenter);
|
||
XPoint ptLow=ptPick-XPoint(_DIST_SNAP, _DIST_SNAP);
|
||
XPoint ptUp=ptPick+XPoint(_DIST_SNAP, _DIST_SNAP);
|
||
AssureOnScreen(ptLow, ptUp);
|
||
|
||
TDragPickEntSet ssDrag(ptPick, SS_FREE);
|
||
ssDrag += ent;
|
||
XPoint ptDrag=ptPick;
|
||
ads_initget(RSG_OTHER, NULL);
|
||
int rc = ads_draggen(ssDrag, pszPrompt, 0,
|
||
DragArcOrCircle,
|
||
ptDrag);
|
||
if (rc == RTNORM)
|
||
{
|
||
ads_real nRadius=ads_distance(g_ptDragCenter, ptDrag);
|
||
ent.SetData(40, nRadius);
|
||
|
||
return ent.Modify();
|
||
}
|
||
else if (rc == RTSTR)
|
||
{
|
||
TCHAR sInput[80]=_T("");
|
||
ads_getinput(sInput);
|
||
if (!sInput[0])
|
||
{
|
||
return RTERROR;
|
||
}
|
||
ads_real nRadius=_tstof(sInput);
|
||
if (nRadius<1.0E-9)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
ent.SetData(40, nRadius);
|
||
|
||
return ent.Modify();
|
||
}
|
||
|
||
return RTERROR;
|
||
}
|
||
|
||
// 适合于Z轴方向==WCS Z轴的UCS
|
||
// ptBase--UCS
|
||
// ptPick0--UCS
|
||
int DragRotation(const Entity &e, const TCHAR *pszPrompt, const XPoint &ptBase, const XPoint &ptPick0)
|
||
{
|
||
Entity ent=e;
|
||
g_ptDragCenter = ptBase;
|
||
g_nOldAngle = ads_angle(Ucs2Wcs(ptBase), Ucs2Wcs(ptPick0));
|
||
|
||
XPoint ptLow=ptBase-XPoint(_DIST_SNAP, _DIST_SNAP);
|
||
XPoint ptUp=ptBase+XPoint(_DIST_SNAP, _DIST_SNAP);
|
||
AssureOnScreen(ptLow, ptUp);
|
||
|
||
TDragPickEntSet ssDrag(ptBase, SS_FREE);
|
||
ssDrag += ent;
|
||
XPoint ptDrag=ptPick0;
|
||
ads_initget(RSG_OTHER, NULL);
|
||
int rc = ads_draggen(ssDrag, pszPrompt, 0,
|
||
DragRotationAction,
|
||
ptDrag);
|
||
if (rc == RTNORM)
|
||
{
|
||
ads_real nRot=CT_std_angle(ads_angle(Ucs2Wcs(g_ptDragCenter), Ucs2Wcs(ptDrag))-g_nOldAngle)*180/PI;
|
||
XPushVar<int> vOsMode(_T("OSMODE"), 0);
|
||
// Zyu modify on 100726,支持64位
|
||
//return SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ssDrag, RTSTR, _T(""),
|
||
// RT3DPOINT, &g_ptDragCenter, RTREAL, nRot, RTNONE);
|
||
return SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ssDrag, RTSTR, _T(""),
|
||
RT3DPOINT, &g_ptDragCenter, RTREAL, nRot, RTNONE);
|
||
}
|
||
else if (rc == RTSTR)
|
||
{
|
||
TCHAR sInput[80]=_T("");
|
||
ads_getinput(sInput);
|
||
if (!sInput[0])
|
||
{
|
||
return RTERROR;
|
||
}
|
||
ads_real nRot=_tstof(sInput);
|
||
if (fabs(nRot)<_angSnap)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
XPushVar<int> vOsMode(_T("OSMODE"), 0);
|
||
// Zyu modify on 100726,支持64位
|
||
//return SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ssDrag, RTSTR, _T(""),
|
||
// RT3DPOINT, &g_ptDragCenter, RTREAL, nRot, RTNONE);
|
||
return SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ssDrag, RTSTR, _T(""),
|
||
RT3DPOINT, &g_ptDragCenter, RTREAL, nRot, RTNONE);
|
||
}
|
||
|
||
return RTERROR;
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 通过一线裁剪轴网,命令:TrimOneSideLine
|
||
void TrimOneSideLine()
|
||
{
|
||
// 设置捕捉模式为nea
|
||
XPushVar<int> vOsMode(_T("OSMODE"), 512);
|
||
//xg_setvar(_T("OSMODE"), 512);
|
||
|
||
// 取得裁剪线起点或裁减线上一点
|
||
XPoint ptStart, ptEnd, ptSide;
|
||
if (ads_getpoint(NULL, _T("\n请输入裁剪线的起点或选择一裁剪线:"), ptStart) != RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 关闭捕捉模式
|
||
xg_setvar(_T("OSMODE"), 0);
|
||
|
||
// 检查是否选择了直线或多义线段
|
||
Entity entTrim;
|
||
ads_matrix xformres;
|
||
struct resbuf *refstkres;
|
||
BOOL bSelectedLine = FALSE;
|
||
if (ads_nentselp(NULL, entTrim, ptStart, TRUE, xformres, &refstkres) == RTNORM)
|
||
{
|
||
RBList rb(refstkres);
|
||
OPENOBJ_BEGIN(entTrim, AcDb::kForRead, AcDbCurve, pLine);
|
||
if (pLine != NULL)
|
||
{
|
||
ASSERT(pLine->isKindOf(AcDbCurve::desc()));
|
||
if (pLine->isKindOf(AcDbLine::desc()))
|
||
{
|
||
// 取得直线起点和终点
|
||
bSelectedLine = TRUE;
|
||
ptStart = ((AcDbLine*)pLine)->startPoint();
|
||
ptEnd = ((AcDbLine*)pLine)->endPoint();
|
||
}
|
||
else if (pLine->isKindOf(AcDbPolyline::desc()))
|
||
{
|
||
// 取得所选的多义线段起点和终点
|
||
XPoint pt;
|
||
double dParam;
|
||
pt=Ucs2Wcs(ptStart);
|
||
//acdbUcs2Wcs(ptStart, pt, Adesk::kFalse);
|
||
if (((AcDbPolyline*)pLine)->getParamAtPoint(pt, dParam) == Acad::eOk)
|
||
{
|
||
bSelectedLine = TRUE;
|
||
dParam = int(dParam);
|
||
((AcDbPolyline*)pLine)->getPointAtParam(dParam, ptStart);
|
||
((AcDbPolyline*)pLine)->getPointAtParam(dParam + 1.0, ptEnd);
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
// 如果没有选择直线,则提示选择裁剪线终点
|
||
if (!bSelectedLine)
|
||
{
|
||
if (ads_getpoint(ptStart, _T("\n请输入裁剪线的终点:"), ptEnd) != RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
ptStart=Ucs2Wcs(ptStart);
|
||
ptEnd=Ucs2Wcs(ptEnd);
|
||
}
|
||
|
||
// 取得裁减方向
|
||
ads_grdraw(ptStart, ptEnd, -1, 1);
|
||
if (ads_getpoint(NULL, _T("\n请输入一点以确定裁剪的是哪一边:"), ptSide) != RTNORM)
|
||
{
|
||
SHads_command(RTSTR, _T("REDRAW"), RTNONE);
|
||
|
||
return;
|
||
}
|
||
ptSide=Ucs2Wcs(ptSide);
|
||
SHads_command(RTSTR, _T("REDRAW"), RTNONE);
|
||
|
||
// 取得所有轴网
|
||
PickSet ss(SS_FREE);
|
||
RBList mask(RTDXF0, _T("LINE"), 8, LAY_AXIS, NULL);
|
||
if (ss.Get(_T("X"), NULL, NULL, mask) != RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 生成运算对象
|
||
AcGeVector3d vec1, vec2;
|
||
AcDbLine TrimLine(ptStart, ptEnd);
|
||
AcDbLine SideLine(ptSide, asPnt3d(ptSide) + (asPnt3d(ptEnd) - asPnt3d(ptStart)));
|
||
|
||
// 裁剪与裁剪线相交的轴网
|
||
long lCount = ss.Length();
|
||
for (long l = 0; l < lCount; l++)
|
||
{
|
||
// 取得并打开轴线实体
|
||
Entity ent = ss[l];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbLine, pLine);
|
||
if (pLine == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
ASSERT(pLine->isKindOf(AcDbLine::desc()));
|
||
|
||
// 求得与裁剪线的交点
|
||
AcGePoint3dArray arptInt1, arptInt2;
|
||
if (TrimLine.intersectWith(pLine, AcDb::kOnBothOperands, arptInt1) != Acad::eOk
|
||
|| arptInt1.length() <= 0)
|
||
{
|
||
continue;
|
||
}
|
||
if (SideLine.intersectWith(pLine, AcDb::kExtendBoth, arptInt2) != Acad::eOk
|
||
|| arptInt2.length() <= 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 修改轴线的裁剪端顶点到交点
|
||
if ((arptInt2[0] - arptInt1[0]).isCodirectionalTo(pLine->endPoint() - arptInt1[0]))
|
||
{
|
||
pLine->setEndPoint(arptInt1[0]);
|
||
}
|
||
else
|
||
{
|
||
pLine->setStartPoint(arptInt1[0]);
|
||
}
|
||
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
////////////////////////////////////////////////
|
||
// 命令: 轴线多边形裁剪
|
||
// 条件: 必须在WCS下
|
||
void ClipAxis()
|
||
{
|
||
XPoly2D poly2d(1);
|
||
const TCHAR *szPrompts[2]={_T("\n矩形的第一个角点或 [多边形裁剪(P)/轴线取齐(F)]<退出>:"),
|
||
_T("\n多边形的第一点<退出>:")};
|
||
const TCHAR *szKeywords=_T("P F");
|
||
int nClipType=0;
|
||
|
||
XPoint ptStart;
|
||
//while (1)
|
||
{
|
||
adsout << szPrompts[0];
|
||
int nCode;
|
||
INITGET_BEG(0, szKeywords);
|
||
nCode=ads_getpoint(NULL, _T(""), ptStart);
|
||
INITGET_END();
|
||
if (nCode == RTKWORD)
|
||
{
|
||
XString sKey;
|
||
ads_getinput(sKey);
|
||
if (sKey[0] == _T('P'))
|
||
{
|
||
if (ads_getpoint(NULL, szPrompts[1], ptStart)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
nClipType=1;
|
||
}
|
||
else
|
||
{
|
||
nClipType=2;
|
||
}
|
||
}
|
||
else if (nCode!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (nClipType == 0)
|
||
{
|
||
XPoint ptOther;
|
||
int nCode=XGetCorner(ptStart, _T("\n另一个角点<退出>:"), ptOther);
|
||
if (nCode!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
XRectAngle rect(ptStart, ptOther);
|
||
rect.AsPoly2D(poly2d);
|
||
}
|
||
else if (nClipType == 1)
|
||
{
|
||
XPoint pt2;
|
||
XScreenDc dc;
|
||
dc.m_nDrawMode=1;
|
||
DStack<XPoint> aStack;
|
||
aStack.Push(new XPoint(ptStart));
|
||
while (1)
|
||
{
|
||
XPoint &ptFrom=*aStack.Top();
|
||
if (aStack.Length()>=3)
|
||
{
|
||
adsout << _T("\n下一点或 [回退(U)]<封闭>: ");
|
||
}
|
||
else
|
||
{
|
||
adsout << _T("\n下一点或 [回退(U)]<退出>: ");
|
||
}
|
||
int rc;
|
||
INITGET_BEG(0, _T("U"));
|
||
rc=ads_getpoint(ptFrom, _T(""), pt2);
|
||
INITGET_END();
|
||
if (rc == RTCAN)
|
||
{
|
||
aStack.Reset();
|
||
|
||
return;
|
||
}
|
||
else if (rc == RTKWORD)
|
||
{
|
||
if (*aStack.Top() != ptStart) // Not on first state
|
||
{
|
||
XPoint *pPt2 = aStack.Pop();
|
||
XPoint *pPt1 = aStack.Top();
|
||
dc.SetColor(-1);
|
||
dc << XLine(*pPt1, *pPt2);
|
||
delete pPt2;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (rc == RTNONE)
|
||
{
|
||
if (aStack.Length()<3)
|
||
{
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
pt2=ptStart;
|
||
}
|
||
}
|
||
XLine ln(*aStack.Top(), pt2);
|
||
if (ln.GetLength()>_DIST_SNAP)
|
||
{
|
||
dc.SetColor(7);
|
||
dc << ln;
|
||
if (!(rc == RTNONE))
|
||
{
|
||
aStack.Push(new XPoint(pt2));
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
poly2d.Reset();
|
||
XPoint *ptCur=NULL;
|
||
while ((ptCur=aStack.Pop())!=NULL)
|
||
{
|
||
poly2d.AppendNode(*ptCur);
|
||
delete ptCur;
|
||
}
|
||
poly2d.Compress();
|
||
if (!poly2d || poly2d.Length()<3)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
TrimOneSideLine();
|
||
|
||
return;
|
||
}
|
||
|
||
XPoly poly1;
|
||
poly2d.MapToPolygon(poly1);
|
||
RBList mask=ads_buildlist(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL);
|
||
PickSet ss(SS_FREE), ssIn(SS_FREE|SS_CREATE), ssOut(SS_FREE|SS_CREATE);
|
||
if (ss.Get(_T("CP"), RBList(poly1.Fence()), NULL, mask)!=RTNORM)
|
||
{
|
||
return ;
|
||
}
|
||
|
||
// UCS to WCS
|
||
poly2d.TransUCS(Groups(1), Groups(0));
|
||
if (PolyClip(ss, poly2d, ssIn, ssOut) == RTNORM)
|
||
{
|
||
ssIn.Erase();
|
||
//ads_redraw(NULL,0);
|
||
}
|
||
poly2d.TransUCS(Groups(0), Groups(1));
|
||
XScreenDc dc;
|
||
dc.m_nDrawMode=1;
|
||
dc << poly2d;
|
||
}
|
||
|
||
|
||
|
||
///////////////////////////////////////////
|
||
// 命令: 矩形裁剪
|
||
// 条件: 必须在WCS下
|
||
void RClipA()
|
||
{
|
||
//AsureWCS();
|
||
XPoint ptCorner1, ptCorner2;
|
||
if (XGetPoint(NULL, _T("\n第一个角点"), ptCorner1)!=RTNORM)
|
||
{
|
||
return ;
|
||
}
|
||
if (XGetCorner(ptCorner1, _T("\n另一个角点<退出>:"), ptCorner2)!=RTNORM)
|
||
{
|
||
return ;
|
||
}
|
||
if (ptCorner1 == ptCorner2)
|
||
{
|
||
return ;
|
||
}
|
||
|
||
XRectAngle box(ptCorner1, ptCorner2);
|
||
XPoly2D poly(1);
|
||
poly.AppendNode(box.lowLeft);
|
||
poly.AppendNode(XPoint(box.upRight.x, box.lowLeft.y, box.lowLeft.z));
|
||
poly.AppendNode(box.upRight);
|
||
poly.AppendNode(XPoint(box.lowLeft.x, box.upRight.y, box.lowLeft.z));
|
||
|
||
RBList mask=ads_buildlist(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL);
|
||
PickSet ss(SS_FREE), ssIn(SS_FREE|SS_CREATE), ssOut(SS_FREE|SS_CREATE);
|
||
if (ss.Get(_T("C"), ptCorner1, ptCorner2, mask)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (PolyClip(ss, poly, ssIn, ssOut) == RTNORM)
|
||
{
|
||
ssIn.Erase();
|
||
ads_redraw(NULL,0);
|
||
XScreenDc dc;
|
||
dc.m_nDrawMode = 1;
|
||
dc << box;
|
||
}
|
||
|
||
return ;
|
||
}
|
||
|
||
// add by xlc on 070730
|
||
// 判断两条直线端点的最远距离
|
||
int ComputDist(AcGePoint3d ptStart1, // [in]line1起点
|
||
AcGePoint3d ptEnd1, // [in]line1终点
|
||
AcGePoint3d ptStart2, // [in]line2起点
|
||
AcGePoint3d ptEnd2, // [in]line2终点
|
||
BOOL bDim) // [in]是否标注(轴网标注时轴线没有搭在一起时不合并)
|
||
{
|
||
double ss = ptStart1.distanceTo(ptStart2);
|
||
double se = ptStart1.distanceTo(ptEnd2);
|
||
double es = ptEnd1.distanceTo(ptStart2);
|
||
double ee = ptEnd1.distanceTo(ptEnd2);
|
||
|
||
// modify by xlc on 090511 两点轴标时不合并不相交的轴线
|
||
XLine line1(XPoint(ptStart1),XPoint(ptEnd1),LS_FINITE),
|
||
line2(XPoint(ptStart2),XPoint(ptEnd2),LS_FINITE);
|
||
|
||
if ((ss - se > 1.0E-6) && (ss - ee > 1.0E-6) && (ss - es > 1.0E-6)
|
||
|| (es < 1.0E-6 && se < 1.0E-6))
|
||
{
|
||
if (bDim &&
|
||
(line1.HitTest2d(line2.EndPoint())>5 &&
|
||
line2.HitTest2d(line1.EndPoint())>5))
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
else if ((se - ss > 1.0E-6) && (se - ee > 1.0E-6) && (se - es > 1.0E-6)
|
||
|| (ss < 1.0E-6 && ee < 1.0E-6))
|
||
{
|
||
if (bDim &&
|
||
(line1.HitTest2d(line2.StartPoint())>5 &&
|
||
line2.HitTest2d (line1.EndPoint())>5))
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
else if ((es - se > 1.0E-6) && (es - ee > 1.0E-6) && (es - ss > 1.0E-6))
|
||
{
|
||
if (bDim &&
|
||
(line1.HitTest2d(line2.EndPoint())>5 &&
|
||
line2.HitTest2d (line1.StartPoint())>5))
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 2;
|
||
}
|
||
else if ((ee - se > 1.0E-6) && (ee - ss > 1.0E-6) && (ee - es > 1.0E-6))
|
||
{
|
||
if (bDim &&
|
||
(line1.HitTest2d(line2.StartPoint())>5 &&
|
||
line2.HitTest2d (line1.StartPoint())>5))
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 3;
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
|
||
// Zyu add on 100610, 计算两条圆弧合并后的起始角度和结束角度,返回值代表是否可以合并圆弧
|
||
bool MergeArc(double &dStartAngle1, // [in, out] 合并圆弧的起始角度
|
||
double &dEndAngle1, // [in, out] 合并圆弧的结束角度
|
||
double dStartAngle2, // [in] 被合并圆弧的起始角度
|
||
double dEndAngle2, // [in] 被合并圆弧的结束角度
|
||
BOOL bDim = FALSE) // [in] 是否标注(轴网标注时轴线没有搭在一起时不合并)
|
||
{
|
||
TGGeSector sec1(dStartAngle1, dEndAngle1); // 合并圆弧对应的扇形
|
||
TGGeSector sec2(dStartAngle2, dEndAngle2); // 被合并圆弧对应的扇形
|
||
|
||
// 如果两个圆弧有重合的部分
|
||
if (sec1.AngleFlag(dStartAngle2) || sec1.AngleFlag(dEndAngle2) ||
|
||
sec2.AngleFlag(dStartAngle1) || sec2.AngleFlag(dEndAngle1))
|
||
{
|
||
// 判断一平面向量是否在扇形区内
|
||
if (sec2.AngleFlag(dStartAngle1))
|
||
{
|
||
dStartAngle1 = dStartAngle2;
|
||
}
|
||
|
||
if (sec2.AngleFlag(dEndAngle1))
|
||
{
|
||
dEndAngle1 = dEndAngle2;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
// sg delete 100720,增加了圆、弧等功能的支持,变成了新的里TchDupAxis的函数
|
||
/*
|
||
// 消除重线
|
||
BOOL RemoveDupLine(PickSet ss, BOOL bDim)
|
||
{
|
||
if (ss.Length() < 2)
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
long n = 0;
|
||
do
|
||
{
|
||
Entity ent = ss[n];
|
||
XDbObject obj(ent, AcDb::kForRead);
|
||
if (!obj)
|
||
continue;
|
||
|
||
AcDbLine *pLine = AcDbLine::cast(obj.m_pObject);
|
||
if (pLine != NULL) // 直线
|
||
{
|
||
XLine line;
|
||
line.StartPoint() = XPoint(pLine->startPoint().x, pLine->startPoint().y, pLine->startPoint().z);
|
||
line.EndPoint() = XPoint(pLine->endPoint().x, pLine->endPoint().y, pLine->endPoint().z);
|
||
AcGeVector3d vect = pLine->endPoint() - pLine->startPoint();
|
||
|
||
for (long i=n+1; i<ss.Length(); i++)
|
||
{
|
||
Entity en = ss[i];
|
||
XDbObject objNew(en, AcDb::kForRead);
|
||
if (!objNew)
|
||
continue;
|
||
|
||
AcDbLine *pLineNew = AcDbLine::cast(objNew.m_pObject);
|
||
if (pLineNew != NULL)
|
||
{
|
||
XLine lineNew;
|
||
lineNew.StartPoint() =
|
||
XPoint(pLineNew->startPoint().x, pLineNew->startPoint().y, pLineNew->startPoint().z);
|
||
lineNew.EndPoint() =
|
||
XPoint(pLineNew->endPoint().x, pLineNew->endPoint().y, pLineNew->endPoint().z);
|
||
AcGeVector3d vectNew = pLineNew->endPoint() - pLineNew->startPoint();
|
||
|
||
if (vect.isParallelTo(vectNew)) // 平行
|
||
{
|
||
int nn = (lineNew.StartPoint())&(line);
|
||
if (nn != PR_OUTSIDE) // 共线
|
||
{
|
||
int nRet = ComputDist(pLine->startPoint(), pLine->endPoint(),
|
||
pLineNew->startPoint(), pLineNew->endPoint(), bDim);
|
||
if (nRet != -1) // 可以合并
|
||
{
|
||
pLine->upgradeOpen();
|
||
if (nRet == 0) // ss
|
||
{
|
||
pLine->setEndPoint(pLineNew->startPoint());
|
||
}
|
||
else if (nRet == 1) // se
|
||
{
|
||
pLine->setEndPoint(pLineNew->endPoint());
|
||
}
|
||
else if (nRet == 2) // es
|
||
{
|
||
pLine->setStartPoint(pLineNew->startPoint());
|
||
}
|
||
else // ee
|
||
{
|
||
pLine->setStartPoint(pLineNew->endPoint());
|
||
}
|
||
pLine->downgradeOpen();
|
||
|
||
pLineNew->upgradeOpen();
|
||
pLineNew->erase();
|
||
pLineNew->close();
|
||
ss -= en;
|
||
}
|
||
else // 不可以合并
|
||
{
|
||
pLineNew->close();
|
||
}
|
||
}
|
||
else // 不共线
|
||
{
|
||
pLineNew->close();
|
||
}
|
||
}
|
||
else // 不平行
|
||
{
|
||
pLineNew->close();
|
||
}
|
||
}
|
||
}
|
||
pLine->close();
|
||
}
|
||
n++;
|
||
} while (n<ss.Length() - 1);
|
||
|
||
return TRUE;
|
||
}
|
||
*/
|
||
// 重合轴网
|
||
namespace TchDupAxis
|
||
{
|
||
// 判断两直线是否重合
|
||
bool IsDupLine(AcDbLine *pLine1, AcDbLine *pLine2, bool bDim = false);
|
||
// 判断两弧线是否重合
|
||
bool IsDupArc(AcDbArc *pArc1, AcDbArc *pArc2, bool bDim = false);
|
||
// 判断两圆是否重合
|
||
bool IsDupCircle(AcDbCircle *pCircle1, AcDbCircle *pCircle2, bool bDim = false);
|
||
|
||
// 消除重线
|
||
bool RemoveDupLine(PickSet &ssLine, bool bDim = false);
|
||
// 消除重弧线
|
||
bool RemoveDupArc(PickSet &ssArc, bool bDim = false);
|
||
// 消除重圆
|
||
bool RemoveDupCircle(PickSet &ssCircle, bool bDim = false);
|
||
|
||
// 消除重合轴网
|
||
bool RemoveDupAxis(PickSet ss, bool bDim = false);
|
||
};
|
||
|
||
// 判断两直线是否重合
|
||
bool TchDupAxis::IsDupLine(AcDbLine *pLine1, AcDbLine *pLine2, bool bDim)
|
||
{
|
||
if (pLine1==NULL || pLine2==NULL)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 后续可增加首先对图层、线型等的过滤
|
||
|
||
AcGeVector3d vect1 = pLine1->endPoint() - pLine1->startPoint();
|
||
AcGeVector3d vect2 = pLine2->endPoint() - pLine2->startPoint();
|
||
if (vect1.isParallelTo(vect2) != Adesk::kTrue) // 不平行
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 问题描述:1.重合的轴线数量≥3个时,不能完全消重。2.合并的轴线不是最大长度,
|
||
// 完全重合的两条轴线不能合并。
|
||
// 解决方法:1.在选择集ss里删除实体en时,对应的下标计数器i也要减1,保证
|
||
// 遍历时不会漏掉任何一个实体。2.废弃原有算法。新算法是将被合并的直线端点投影到
|
||
// 原直线上,如果投影点在直线的延长线上,则设置为端点。
|
||
// 修改人,修改时间:Zyu modify on 100612.
|
||
TGGeCurveSegment cvSegLine1; // 原来的线段
|
||
cvSegLine1.StartPoint() = XPoint(pLine1->startPoint().x, pLine1->startPoint().y, pLine1->startPoint().z);
|
||
cvSegLine1.EndPoint() = XPoint(pLine1->endPoint().x, pLine1->endPoint().y, pLine1->endPoint().z);
|
||
cvSegLine1.SetLineFlag(LS_FINITE);
|
||
|
||
TGGeCurveSegment cvSegLine2; // 被合并的线段
|
||
cvSegLine2.StartPoint() = XPoint(pLine2->startPoint().x, pLine2->startPoint().y, pLine2->startPoint().z);
|
||
cvSegLine2.EndPoint() = XPoint(pLine2->endPoint().x, pLine2->endPoint().y, pLine2->endPoint().z);
|
||
cvSegLine2.SetLineFlag(LS_FINITE);
|
||
|
||
int nRet = (cvSegLine2.StartPoint())&(cvSegLine1);
|
||
if (nRet == PR_OUTSIDE) // 不共线
|
||
{
|
||
return false;
|
||
}
|
||
|
||
TADSGePoint3d ptResStart; // 被合并线段起点投影点
|
||
TADSGePoint3d ptResEnd; // 被合并线段终点投影点
|
||
bool bExtendStart = false; // 被合并线段起点投影在原线段的延长线上
|
||
bool bExtendEnd = false; // 被合并线段终点投影在原线段的延长线上
|
||
bool bMerge = true; // 是否合并两条线段
|
||
|
||
// 求被合并线段的开始点在原线段上的投影点
|
||
if (RTNORM == cvSegLine1.ProjectToMe(cvSegLine2.StartPoint(), ptResStart))
|
||
{
|
||
bExtendStart = (PR_EXTEND == (ptResStart & cvSegLine1));
|
||
}
|
||
|
||
// 求被合并线段的结束点在原线段上的投影点
|
||
if (RTNORM == cvSegLine1.ProjectToMe(cvSegLine2.EndPoint(), ptResEnd))
|
||
{
|
||
bExtendEnd = (PR_EXTEND == (ptResEnd & cvSegLine1));
|
||
}
|
||
|
||
// 求line上与投影点最近的端点
|
||
AcGePoint3d ptNearStart = asPnt3d(cvSegLine1.NearPoint(asDblArray((AcGePoint3d)ptResStart)));
|
||
AcGePoint3d ptNearEnd = asPnt3d(cvSegLine1.NearPoint(asDblArray((AcGePoint3d)ptResEnd)));
|
||
|
||
// 当进行轴网标注时轴线没有搭在一起时不合并
|
||
if (bDim && bExtendStart && bExtendEnd)
|
||
{
|
||
// 当两个投影点在与line的最近点是同一个点时,说明两轴线没有搭在一起,不合并
|
||
bMerge = !ptNearStart.isEqualTo(ptNearEnd);
|
||
}
|
||
|
||
if (!bMerge)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 如果投影点在原直线的延长线上
|
||
if (pLine1->upgradeOpen() == Acad::eOk)
|
||
{
|
||
if (bExtendStart)
|
||
{
|
||
// 将离投影点更近的端点延长到投影点
|
||
if (ptNearStart.isEqualTo(cvSegLine1.GetStartPoint()))
|
||
{
|
||
pLine1->setStartPoint(ptResStart);
|
||
cvSegLine1.SetStartPoint(ptResStart);
|
||
}
|
||
else
|
||
{
|
||
pLine1->setEndPoint(ptResStart);
|
||
cvSegLine1.SetEndPoint(ptResStart);
|
||
}
|
||
}
|
||
|
||
bExtendEnd = (PR_EXTEND == (ptResEnd & cvSegLine1));
|
||
if (bExtendEnd)
|
||
{
|
||
ptNearEnd = asPnt3d(cvSegLine1.NearPoint(asDblArray((AcGePoint3d)ptResEnd)));
|
||
// 将离投影点更近的端点延长到投影点
|
||
if (ptNearEnd.isEqualTo(cvSegLine1.GetEndPoint()))
|
||
{
|
||
pLine1->setEndPoint(ptResEnd);
|
||
cvSegLine1.SetEndPoint(ptResEnd);
|
||
}
|
||
else
|
||
{
|
||
pLine1->setStartPoint(ptResEnd);
|
||
cvSegLine1.SetStartPoint(ptResEnd);
|
||
}
|
||
}
|
||
pLine1->downgradeOpen();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 判断两弧线是否重合
|
||
bool TchDupAxis::IsDupArc(AcDbArc *pArc1, AcDbArc *pArc2, bool bDim)
|
||
{
|
||
if (pArc1==NULL || pArc2==NULL)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 判断条件:两条弧圆心和半径都相同
|
||
if (pArc1->center().isEqualTo(pArc2->center()) &&
|
||
fabs(pArc1->radius() - pArc2->radius()) < _DIST_SNAP)
|
||
{
|
||
double dStartAngle = pArc1->startAngle(),
|
||
dEndAngle = pArc1->endAngle();
|
||
if (!MergeArc(dStartAngle, dEndAngle, pArc2->startAngle(), pArc2->endAngle(), bDim))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if (pArc1->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pArc1->setStartAngle(dStartAngle);
|
||
pArc1->setEndAngle(dEndAngle);
|
||
pArc1->downgradeOpen();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
// 判断两圆是否重合
|
||
bool TchDupAxis::IsDupCircle(AcDbCircle *pCircle1, AcDbCircle *pCircle2, bool bDim)
|
||
{
|
||
if (pCircle1==NULL || pCircle2==NULL)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if (pCircle1->center().isEqualTo(pCircle2->center()) &&
|
||
fabs(pCircle1->radius() - pCircle2->radius()) < _DIST_SNAP)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
// 消除重线
|
||
bool TchDupAxis::RemoveDupLine(PickSet &ssLine, bool bDim)
|
||
{
|
||
long lLength = ssLine.Length();
|
||
for (long i=0; i<lLength-1; i++)
|
||
{
|
||
Entity ent1 = ssLine[i];
|
||
OPENOBJ_BEGIN(ent1, AcDb::kForRead, AcDbLine, pLine1);
|
||
if (pLine1 == NULL)
|
||
continue;
|
||
|
||
for (long j=i+1; j<lLength; j++) // 与选择集里的第n个以后的实体,做重合检查
|
||
{
|
||
Entity ent2 = ssLine[j];
|
||
OPENOBJ_BEGIN(ent2, AcDb::kForRead, AcDbLine, pLine2);
|
||
if (pLine2 == NULL)
|
||
continue;
|
||
|
||
// 判断是否是重复的直线
|
||
if (!TchDupAxis::IsDupLine(pLine1, pLine2, bDim)) // 不重合
|
||
continue;
|
||
|
||
if (pLine2->upgradeOpen() == Acad::eOk) // 重合
|
||
{
|
||
pLine2->erase(); // 删除
|
||
pLine2->downgradeOpen();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
ssLine -= ent2;
|
||
j--; // 下标减1,保证选择集里遍历时不会漏掉任何一个实体
|
||
lLength--;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 消除重弧线
|
||
bool TchDupAxis::RemoveDupArc(PickSet &ssArc, bool bDim)
|
||
{
|
||
long lLength = ssArc.Length();
|
||
for (long i=0; i<lLength-1; i++)
|
||
{
|
||
Entity ent1 = ssArc[i];
|
||
OPENOBJ_BEGIN(ent1, AcDb::kForRead, AcDbArc, pArc1);
|
||
if (pArc1 == NULL)
|
||
continue;
|
||
|
||
for (long j=i+1; j<lLength; j++) // 与选择集里的第n个以后的实体,做重合检查
|
||
{
|
||
Entity ent2 = ssArc[j];
|
||
OPENOBJ_BEGIN(ent2, AcDb::kForRead, AcDbArc, pArc2);
|
||
if (pArc2 == NULL)
|
||
continue;
|
||
|
||
// 判断是否是重复的直线
|
||
if (!TchDupAxis::IsDupArc(pArc1, pArc2, bDim)) // 不重合
|
||
continue;
|
||
|
||
if (pArc2->upgradeOpen() == Acad::eOk) // 重合
|
||
{
|
||
pArc2->erase(); // 删除
|
||
pArc2->downgradeOpen();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
ssArc -= ent2;
|
||
j--;
|
||
lLength--;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 消除重圆
|
||
bool TchDupAxis::RemoveDupCircle(PickSet &ssCircle, bool bDim)
|
||
{
|
||
long lLength = ssCircle.Length();
|
||
for (long i=0; i<lLength-1; i++)
|
||
{
|
||
Entity ent1 = ssCircle[i];
|
||
OPENOBJ_BEGIN(ent1, AcDb::kForRead, AcDbCircle, pCircle1);
|
||
if (pCircle1 == NULL)
|
||
continue;
|
||
|
||
for (long j=i+1; j<lLength; j++) // 与选择集里的第n个以后的实体,做重合检查
|
||
{
|
||
Entity ent2 = ssCircle[j];
|
||
OPENOBJ_BEGIN(ent2, AcDb::kForRead, AcDbCircle, pCircle2);
|
||
if (pCircle2 == NULL)
|
||
continue;
|
||
|
||
// 判断是否是重复的直线
|
||
if (!TchDupAxis::IsDupCircle(pCircle1, pCircle2, bDim)) // 不重合
|
||
continue;
|
||
|
||
if (pCircle2->upgradeOpen() == Acad::eOk) // 重合
|
||
{
|
||
pCircle2->erase(); // 删除
|
||
pCircle2->downgradeOpen();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
ssCircle -= ent2;
|
||
j--;
|
||
lLength--;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 消除重合轴网
|
||
bool TchDupAxis::RemoveDupAxis(PickSet ss, bool bDim)
|
||
{
|
||
if (ss.Length() < 2)
|
||
{
|
||
return false; // 选择集内对象不足两个,不需要消重
|
||
}
|
||
|
||
PickSet ssLine(SS_FREE);
|
||
ssLine += ss;
|
||
ssLine.BaseFilter(RBList(RTDXF0, _T("LINE"), NULL)); // 只保留直线
|
||
if (ssLine.Length() > 0)
|
||
{
|
||
ss -= ssLine;
|
||
|
||
TchDupAxis::RemoveDupLine(ssLine, bDim); // 处理直线和直线相交的情况
|
||
ss += ssLine;
|
||
}
|
||
|
||
PickSet ssArc(SS_FREE);
|
||
ssArc += ss;
|
||
ssArc.BaseFilter(RBList(RTDXF0, _T("ARC"), NULL)); // 只保留弧线
|
||
if (ssArc.Length() > 0)
|
||
{
|
||
ss -= ssArc;
|
||
|
||
TchDupAxis::RemoveDupArc(ssArc, bDim); // 处理弧线和弧线相交的情况
|
||
ss += ssArc;
|
||
}
|
||
|
||
|
||
PickSet ssCircle(SS_FREE);
|
||
ssCircle += ss;
|
||
ssCircle.BaseFilter(RBList(RTDXF0, _T("CIRCLE"), NULL)); // 只保留圆
|
||
if (ssCircle.Length() > 0)
|
||
{
|
||
ss -= ssCircle;
|
||
|
||
TchDupAxis::RemoveDupCircle(ssCircle, bDim); // 处理圆和圆相交的情况
|
||
ss += ssCircle;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// modified by cwk
|
||
// 命令:两点轴标
|
||
void DimAxisBy2Curve()
|
||
{
|
||
XAxisDimSet::g_AntiClockWise = TRUE; // 默认逆时针方向
|
||
InitLayer(LAY_DIMAX, TRUE);
|
||
|
||
// [2010-4-7 wubo] 重复语句。与函数开头重复。
|
||
// XAxisDimSet::g_AntiClockWise = 1; // 默认逆时针方向
|
||
Entity entFirst, entFinal;
|
||
XPoint ptPick1, ptPick2;
|
||
TCHAR szLabStart[80] = _T(""); // 起始轴号
|
||
double nAxisDirection = 0.0;
|
||
|
||
CTemporaryResourceOverride vTemp;
|
||
CAxisDim *pDlg = new CAxisDim(acedGetAcadFrame());
|
||
pDlg->m_csLabel = szLabStart;
|
||
pDlg->m_Flag = 0;
|
||
pDlg->Create(CAxisDim::IDD,acedGetAcadFrame());
|
||
acedGetAcadFrame()->SetFocus();
|
||
|
||
RBList mask(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL); // 8为AcDb::kDxfLayerName
|
||
while (pDlg != NULL)
|
||
{
|
||
// 清空上次标注值,不过不知道为什么这样做
|
||
pDlg->m_csLabel = _T("");
|
||
pDlg->UpdateData(FALSE);
|
||
|
||
if (SelectEntity1(_T("\n请选择起始轴线<退出>:"), entFirst, ptPick1, mask) != RTNORM)
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
return ;
|
||
}
|
||
|
||
XCurveSegment curveFirst(entFirst);
|
||
if (!curveFirst.Is(CURVE_CIRCLE))
|
||
{
|
||
nAxisDirection = curveFirst.IDirection(0);
|
||
if (nAxisDirection<PI/4 || nAxisDirection>1.75*PI ||
|
||
(nAxisDirection>0.75*PI && nAxisDirection<1.25*PI))
|
||
{
|
||
_tcscpy(szLabStart, _T("A"));
|
||
|
||
}
|
||
else
|
||
{
|
||
_tcscpy(szLabStart, _T("1"));
|
||
}
|
||
|
||
if (!pDlg->m_csLabel.IsEmpty())
|
||
{
|
||
_tcscpy(szLabStart, pDlg->m_csLabel);
|
||
}
|
||
else
|
||
{
|
||
TCHAR cTemp[256];
|
||
_tcscpy(cTemp,szLabStart);
|
||
pDlg->m_csLabel = cTemp;
|
||
pDlg->UpdateData(FALSE);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
// return;
|
||
}
|
||
|
||
if (entFinal.FilterSelect1(GetPickBoxWcs()/2, _T("\n请选择终止轴线<退出>:"), mask, ptPick2) != RTNORM)
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (entFirst == entFinal)
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
return;
|
||
}
|
||
|
||
ptPick1 = Ucs2Wcs(ptPick1);
|
||
ptPick2 = Ucs2Wcs(ptPick2);
|
||
|
||
XCurveSegment curveFinal(entFinal);
|
||
if (curveFirst.GetCurveType() != curveFinal.GetCurveType())
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
return;
|
||
}
|
||
|
||
BOOL bRadian = FALSE,
|
||
bCirAngular = FALSE;
|
||
XPoint ptAxisNetCen;
|
||
if (curveFirst.Is(CURVE_LINE) &&
|
||
(!CT_IsSameDrt(curveFirst.IDirection(0), curveFinal.IDirection(0), _angSnap) ||
|
||
(curveFirst.StartPoint()&curveFinal) != PR_OUTSIDE))
|
||
{
|
||
PickSet ssTemp(SS_FREE);
|
||
TADSGePoint3d pt1(Wcs2Ucs(curveFirst.StartPoint())),
|
||
pt2(Wcs2Ucs(curveFirst.EndPoint()));
|
||
RBList rbFence = ads_buildlist(RT3DPOINT, &pt1,
|
||
RT3DPOINT, &pt2, NULL);
|
||
bCirAngular = (ssTemp.Get(_T("F"), rbFence, NULL,
|
||
RBList(RTDXF0, _T("CIRCLE"), 8, LAY_AXIS, NULL)) == RTNORM);
|
||
|
||
bRadian = TRUE;
|
||
if ((curveFirst.StartPoint()&curveFinal)!=PR_OUTSIDE)
|
||
{
|
||
ptAxisNetCen = curveFirst.StartPoint()+curveFirst.EndPoint()
|
||
+curveFinal.StartPoint()+curveFinal.EndPoint();
|
||
ptAxisNetCen /= 4.0;
|
||
}
|
||
else
|
||
{
|
||
XLine ln1 = curveFirst.GetLine();
|
||
XLine ln2 = curveFinal.GetLine();
|
||
ln1.SetLineFlag(LS_INFINITE);
|
||
ln2.SetLineFlag(LS_INFINITE);
|
||
ln1.Intersection(&ln2, ptAxisNetCen);
|
||
}
|
||
|
||
int nAnswer = YesNoQuestion(_T("\n是否为按逆时针方向排序编号"));
|
||
if (nAnswer == RTCAN)
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
if (nAnswer == Q_NO)
|
||
{
|
||
XAxisDimSet::g_AntiClockWise = FALSE;
|
||
}
|
||
else
|
||
{
|
||
XAxisDimSet::g_AntiClockWise = TRUE;
|
||
}
|
||
}
|
||
|
||
XAxisPickSet ssAxis(SS_FREE);
|
||
if (bRadian && !XAxisDimSet::g_AntiClockWise)
|
||
{
|
||
ssAxis.GetFrom2Curve(curveFinal, curveFirst);
|
||
}
|
||
else
|
||
{
|
||
ssAxis.GetFrom2Curve(curveFirst, curveFinal);
|
||
}
|
||
|
||
// Zyu add on 100617,将原选择集内的对象,绘制为高亮显示
|
||
ssAxis.Redraw(3);
|
||
|
||
// 增加对辅助轴线的判断,即允许用户自行指定不进行标注的轴线
|
||
PickSet ssCancel(SS_FREE);
|
||
ssCancel += ssAxis;
|
||
|
||
// add by xly on 110304 清空pickfirt选择集
|
||
ads_name ssPickFirst; // 定义一个ads_name变量
|
||
if (acedSSAdd(NULL, NULL, ssPickFirst) == RTNORM) // 构造一个空选择集
|
||
{
|
||
acedSSSetFirst(ssPickFirst, NULL); // 将空选择集赋给PICKFIRST
|
||
}
|
||
|
||
const TCHAR *szTempPrompts[2]={ _T("\n请选择不需要标注的轴线:"), _T("") };
|
||
while(ssCancel.Get(_T(":S:$"), szTempPrompts, NULL, mask) == RTNORM)
|
||
{
|
||
// 首先将不需要标注的轴线,取消高亮
|
||
ssCancel.Redraw(4);
|
||
|
||
// 去掉用户指定的不进行标注的轴线
|
||
ssAxis -= ssCancel;
|
||
}
|
||
|
||
// modify by xly on 100812 如果只剩一个轴网被选中,退出命令时选中轴网不能回复原始状态
|
||
//if (!ssAxis)
|
||
if (!ssAxis || ssAxis.Length()<2)
|
||
{
|
||
// 取消轴网的高亮状态
|
||
ssAxis.Redraw(4);
|
||
adsout << _T("\n不能找到轴网!");
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return ;
|
||
}
|
||
|
||
// modify by xlc on 090225 解决圆弧轴网径线消重合并的问题
|
||
// if (!RemoveDupLine(ssAxis)) //add by xlc on 070806 消除重线
|
||
// return;
|
||
// if (!bRadian)
|
||
// {
|
||
|
||
// 消除重线
|
||
// if (!RemoveDupLine(ssAxis,TRUE))
|
||
|
||
// modify by xly on 100812 修改 命令行多出“Dangerous TPickEntSet = !”的提示
|
||
PickSet ssAxisNew(SS_CREATE);
|
||
ssAxisNew += ssAxis;
|
||
//if (!TchDupAxis::RemoveDupAxis(ssAxis,TRUE))
|
||
if (!TchDupAxis::RemoveDupAxis(ssAxisNew,TRUE))
|
||
{
|
||
// sg add 100609,增加消除重现不成功时,销毁对话框
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
ssAxis.Free();
|
||
ssAxis += ssAxisNew;
|
||
ssAxisNew.Free();
|
||
// }
|
||
|
||
// 似乎没有用处,可删除
|
||
ssAxis.Redraw(3);
|
||
|
||
XPoint ptAxisEnd = curveFirst.NearPoint(ptPick1);
|
||
XCurveSegment cvSortBase; // 排序的基线
|
||
|
||
if (!bRadian)
|
||
{
|
||
if (curveFirst.Is(CURVE_CIRCLE))
|
||
{
|
||
Entity entBase;
|
||
if (entBase.FilterSelect(_T("\n请选择圆形轴网的横(径)线:"), RBList(RTDXF0, _T("LINE"), 8, LAY_AXIS, NULL))!=RTNORM)
|
||
{
|
||
ssAxis.Redraw(4);
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
cvSortBase = XCurveSegment(entBase);
|
||
}
|
||
else
|
||
{
|
||
double nDist2Me = curveFirst.GetDist2Me(curveFinal.StartPoint());
|
||
cvSortBase.StartPoint() = curveFirst.StartPoint();
|
||
ads_polar(curveFirst.StartPoint(), curveFirst.IDirection(0)-PI/2.0, nDist2Me, cvSortBase.EndPoint());
|
||
cvSortBase.SetBulge(0.0);
|
||
// cvSortBase.Make();
|
||
}
|
||
}
|
||
else if (bCirAngular)
|
||
{
|
||
// 圆形轴网角度标注
|
||
cvSortBase = XCircle(ptAxisNetCen, ptAxisNetCen.Distance2d(curveFirst.FarPoint(ptAxisNetCen)));
|
||
}
|
||
else
|
||
{
|
||
double nAng1 = ads_angle(ptAxisNetCen, curveFirst.FarPoint(ptAxisNetCen));
|
||
double nAng2 = ads_angle(ptAxisNetCen, curveFinal.FarPoint(ptAxisNetCen));
|
||
if (XAxisDimSet::g_AntiClockWise == FALSE)
|
||
{
|
||
Exchange(nAng1, nAng2);
|
||
}
|
||
cvSortBase = XArc(ptAxisNetCen, ptAxisNetCen.Distance2d(curveFirst.FarPoint(ptAxisNetCen)),
|
||
nAng1, nAng2);
|
||
}
|
||
|
||
// Add on 2002/6/14, 解决圆形轴网起始轴角度不是最小时无法标注的问题
|
||
double nVal = XAxisDimSet::g_nAngleBegin;
|
||
if (cvSortBase.Is(CURVE_CIRCLE))
|
||
{
|
||
nVal = ads_angle(ptAxisNetCen, curveFirst.FarPoint(ptAxisNetCen));
|
||
}
|
||
|
||
XPushMemVar<double> vTemp1(XAxisDimSet::g_nAngleBegin, nVal);
|
||
if (curveFirst.Is(CURVE_CIRCLE))
|
||
{
|
||
XLine lnBase = cvSortBase.GetLine();
|
||
lnBase.SetLineFlag(LS_FINITE);
|
||
XPoint ptInt;
|
||
if (!curveFirst.Intersection(lnBase, ptInt, XPoint()))
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
nAxisDirection = ads_angle(curveFirst.GetCircle().GetCenterPt(), ptInt)+PI/2.0;
|
||
if (nAxisDirection<PI/4 || nAxisDirection>1.75*PI ||
|
||
(nAxisDirection>0.75*PI && nAxisDirection<1.25*PI))
|
||
{
|
||
_tcscpy(szLabStart, _T("A"));
|
||
}
|
||
else
|
||
{
|
||
_tcscpy(szLabStart, _T("1"));
|
||
}
|
||
}
|
||
|
||
// 建立排序的轴网单侧
|
||
XAxisDimSet dimSet(&cvSortBase);
|
||
long ssLen = ssAxis.Length();
|
||
for (long i=0; i<ssLen; i++)
|
||
{
|
||
Entity ent = ssAxis[i];
|
||
dimSet.Append(new XCurveSegment(ent));
|
||
}
|
||
dimSet.QuickSort(XAxisDimSet::SortFunc);
|
||
|
||
if (!(*dimSet.Head() == curveFirst))
|
||
{
|
||
if (cvSortBase.Is(CURVE_CIRCLE))
|
||
{
|
||
adsout << _T("\n发现不能正确分析的轴网!");
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
if (*dimSet.Tail() == curveFirst)
|
||
{
|
||
dimSet.Reverse();
|
||
XAxisDimSet::g_AntiClockWise = FALSE;
|
||
}
|
||
else
|
||
{
|
||
adsout << _T("\n所选择的不是起始轴线!");
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
}
|
||
|
||
AcDbObjectId idDimStyle = InitDimStyle(bRadian ? DS_ANGLE : DS_LINEAR);
|
||
|
||
TDbAxisLabelSet *pAxisDim = new TDbAxisLabelSet;
|
||
pAxisDim->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pAxisDim->ConvertFrom(dimSet);
|
||
pAxisDim->SetChangePreNum(1 == pDlg->m_iRule); // 设置轴号规则(变前项或者变后项),Zyu add on 100618
|
||
|
||
double nOldLen = pAxisDim->GetLeaderLen(0, TRUE);
|
||
if (pAxisDim->IsArcAxisNet() && pAxisDim->IsArcAxis())
|
||
{
|
||
pAxisDim->SetLeaderLen(0, nOldLen+10.0, TRUE); //圆弧轴网的进深标注, 引线需要加长
|
||
pAxisDim->SetLeaderLen(1, nOldLen+10.0, TRUE); //圆弧轴网的进深标注, 引线需要加长
|
||
}
|
||
|
||
int nLabelFlag = 0, nDimFlag = 0;
|
||
AcDbObjectId idPrevLink;
|
||
if (curveFirst.Is(CURVE_CIRCLE))
|
||
{
|
||
XString szBackup;
|
||
szBackup = szLabStart;
|
||
adsout << _T("\n请输入起始轴号(.空号)<") << szLabStart << _T(">: ");
|
||
if (ads_getstring(0, _T(""), szLabStart) == RTNORM)
|
||
{
|
||
if (_tcscmp(szLabStart, _T(".")) == 0)
|
||
{
|
||
_tcscpy(szLabStart, _T(""));
|
||
}
|
||
else if (!szLabStart[0])
|
||
{
|
||
_tcscpy(szLabStart, szBackup);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pDlg->m_bPrevLink)
|
||
{
|
||
/* Entity entPrev;
|
||
ads_sssetfirst(NULL, NULL);
|
||
if (entPrev.FilterSelect(_T("\n点取前接轴号<退出>:"), RBList(RTDXF0, _T("ATS_AXIS_LABEL"),NULL))!=RTNORM)
|
||
{
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
return;
|
||
}
|
||
acdbGetObjectId(idPrevLink, entPrev);*/
|
||
|
||
//add by cwk on 070123
|
||
PickSet ss(SS_FREE);
|
||
XLine xLineTemp = curveFirst;
|
||
xLineTemp.StartPoint() = Wcs2Ucs(xLineTemp.StartPoint());
|
||
xLineTemp.EndPoint() = Wcs2Ucs(xLineTemp.EndPoint());
|
||
|
||
RBList rbFence = ads_buildlist(RT3DPOINT, &xLineTemp.StartPoint(), RT3DPOINT, &xLineTemp.EndPoint(), NULL);
|
||
ss.Get(_T("F"),rbFence, NULL, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL));
|
||
if (ss.Length() > 0)
|
||
{
|
||
Entity entPrev = ss[0L];
|
||
acdbGetObjectId(idPrevLink, entPrev);
|
||
}
|
||
else
|
||
{
|
||
// add by xly on 101029 解决公共轴线选则失败时恢复亮显
|
||
ssAxis.Redraw(4);
|
||
acutPrintf(_T("\n没有找到前接轴号!"));
|
||
continue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//modified by whl on 070511,保留空号功能
|
||
//if (!pDlg->m_csLabel.IsEmpty())
|
||
//{
|
||
// _tcscpy(szLabStart, pDlg->m_csLabel);
|
||
//}
|
||
_tcscpy(szLabStart, pDlg->m_csLabel);
|
||
}
|
||
|
||
nLabelFlag = pDlg->m_Flag;
|
||
nDimFlag = pDlg->m_Flag;
|
||
/*if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}*/
|
||
}
|
||
|
||
if (!idPrevLink)
|
||
{
|
||
pAxisDim->SortAxisLabel(szLabStart);
|
||
}
|
||
|
||
AcDbObjectId idDimLay = InitLayer(LAY_DIMAX, TRUE);
|
||
AcDbObjectId idTextLay = InitLayer(LAY_AXIS_TEXT, TRUE);
|
||
|
||
List<TDbDimension2*> lstNewDim;
|
||
if (curveFirst.Is(CURVE_CIRCLE))
|
||
{
|
||
pAxisDim->HideSide(1);
|
||
|
||
TAxisLabelEdJig jig(pAxisDim);
|
||
jig.SetPrompt(_T("\n请输入标注位置<退出>:"));
|
||
if (jig.DoIt()!=RTNORM)
|
||
{
|
||
delete pAxisDim;
|
||
return;
|
||
}
|
||
|
||
if (pAxisDim->GetAxisNum()>1)
|
||
{
|
||
TDbDimension2 *pDim1 = new TDbDimension2;
|
||
TDbDimension2 *pDim2 = new TDbDimension2;
|
||
pDim1->SetLayoutRotation(Ucs2Wcs(0));//add by whl on 070306
|
||
pDim2->SetLayoutRotation(Ucs2Wcs(0));//add by whl on 070306
|
||
pDim1->SetStyleId(idDimStyle);
|
||
pDim2->SetStyleId(idDimStyle);
|
||
|
||
if (pAxisDim->GetDimension(0, *pDim1, *pDim2))
|
||
{
|
||
pDim1->setLayer(idDimLay);
|
||
pDim2->setLayer(idDimLay);
|
||
lstNewDim<<pDim1<<pDim2;
|
||
}
|
||
else
|
||
{
|
||
delete pDim1;
|
||
delete pDim2;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int nSidePick = pAxisDim->OnWhichSide(ptPick1);
|
||
if (nLabelFlag != 2)
|
||
{
|
||
if (nLabelFlag == 0)
|
||
pAxisDim->HideSide(1-nSidePick);
|
||
else
|
||
pAxisDim->HideSide(nSidePick);
|
||
}
|
||
|
||
//Modify on 2002/2/22 by ZJQ, 解决弧线标注的半径未能设置在相关的轴线的半径
|
||
// 增加扇形的标注半径
|
||
XAxisPickSet ssOpp(SS_FREE);
|
||
double nRadMin = 0.0,
|
||
nRadMax = 0.0;
|
||
if (bRadian)
|
||
{
|
||
nRadMin = nRadMax = cvSortBase.GetArc().GetRadius();
|
||
ssOpp.GetFromOppsite(curveFirst, FILT_CIRARC_ONLY);
|
||
|
||
long lNum = ssOpp.Length();
|
||
for (long idx=0L; idx<lNum; idx++)
|
||
{
|
||
Entity ent = ssOpp[idx];
|
||
XCurveSegment segTemp(ent);
|
||
if (segTemp.Is(CURVE_ARC))
|
||
{
|
||
if (idx == 0)
|
||
{
|
||
nRadMin = nRadMax = segTemp.GetArc().GetRadius();
|
||
}
|
||
else
|
||
{
|
||
nRadMax = max(nRadMax, segTemp.GetArc().GetRadius());
|
||
nRadMin = min(nRadMin, segTemp.GetArc().GetRadius());
|
||
}
|
||
}
|
||
else if (segTemp.Is(CURVE_CIRCLE))
|
||
{
|
||
if (idx == 0)
|
||
{
|
||
nRadMin = nRadMax = segTemp.GetCircle().GetRadius();
|
||
}
|
||
else
|
||
{
|
||
nRadMax = max(nRadMax, segTemp.GetCircle().GetRadius());
|
||
nRadMin = min(nRadMin, segTemp.GetCircle().GetRadius());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// End
|
||
if (pAxisDim->GetAxisNum() > 1)
|
||
{
|
||
for (int nSide=0; nSide<2; nSide++)
|
||
{
|
||
if (nDimFlag == 0 && nSide != nSidePick)
|
||
{
|
||
continue;
|
||
}
|
||
else if (nDimFlag == 1 && nSide == nSidePick)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TDbDimension2 *pDim1 = new TDbDimension2;
|
||
TDbDimension2 *pDim2 = new TDbDimension2;
|
||
pDim1->SetLayoutRotation(Ucs2Wcs(0)); // add by whl on 070306
|
||
pDim2->SetLayoutRotation(Ucs2Wcs(0)); // add by whl on 070306
|
||
|
||
pDim1->SetStyleId(idDimStyle);
|
||
pDim2->SetStyleId(idDimStyle);
|
||
|
||
// Zyu modify on 100618,根据“尺寸标注对侧”选项设置尺寸的位置
|
||
int iMarkSide = pDlg->m_bOtherSide? !nSide : nSide;
|
||
// if(pAxisDim->GetDimension(nSide, *pDim1, *pDim2))
|
||
if (pAxisDim->GetDimension(iMarkSide, *pDim1, *pDim2))
|
||
{
|
||
// Modify on 2002/2/22 by ZJQ, 解决弧线标注的半径未能设置在相关的轴线的半径
|
||
if (bRadian)
|
||
{
|
||
// Zyu modify on 100618
|
||
// 弧线轴网的开间标注
|
||
// pDim1->SetObjRadius(nSide ? nRadMax : nRadMin);
|
||
// pDim2->SetObjRadius(nSide ? nRadMax : nRadMin);
|
||
pDim1->SetObjRadius(iMarkSide ? nRadMax : nRadMin);
|
||
pDim2->SetObjRadius(iMarkSide ? nRadMax : nRadMin);
|
||
}
|
||
// End
|
||
|
||
pDim1->setLayer(idDimLay);
|
||
pDim2->setLayer(idDimLay);
|
||
lstNewDim<<pDim1<<pDim2;
|
||
}
|
||
else
|
||
{
|
||
delete pDim1;
|
||
delete pDim2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (pAxisDim->IsValid())
|
||
{
|
||
pAxisDim->SetTextLayerId(idTextLay);
|
||
pAxisDim->SetLayoutRotation(Ucs2Wcs(0.0));//modified by whl
|
||
pAxisDim->AddToMSpace(Adesk::kFalse);
|
||
if (!!idPrevLink)
|
||
{
|
||
pAxisDim->SetPrevLink(idPrevLink);
|
||
}
|
||
pAxisDim->close();
|
||
}
|
||
else if (pAxisDim != NULL)
|
||
{
|
||
delete pAxisDim;
|
||
}
|
||
|
||
//尺寸最后画
|
||
for (lstNewDim.MoveToFirst();!lstNewDim.IsOut();lstNewDim.MoveToNext())
|
||
{
|
||
AddToModelSpace(lstNewDim.GetCurData(),Adesk::kTrue);
|
||
}
|
||
ssAxis.Redraw(4);
|
||
}
|
||
|
||
if (pDlg != NULL)
|
||
{
|
||
pDlg->DestroyWindow();
|
||
delete pDlg;
|
||
pDlg = NULL;
|
||
}
|
||
}
|
||
|
||
// curve--第一根轴线
|
||
// cvSortBase--用来排序的正交线
|
||
// ssAxis--待标注的轴线
|
||
// ptPick--点取位置
|
||
// bRadian--是否为角度标注
|
||
void DimAxisLabel(const XCurveSegment &curve, XCurveSegment &cvSortBase,
|
||
PickSet &ssAxis, XPoint ptPick, BOOL bRadian)
|
||
{
|
||
TCHAR szLabStart[80]=_T("1");
|
||
double nAxisDirection=0.0;
|
||
if (curve.Is(CURVE_CIRCLE))
|
||
{
|
||
XLine lnBase=cvSortBase.GetLine();
|
||
lnBase.SetLineFlag(LS_FINITE);
|
||
XPoint ptInt;
|
||
if (!curve.Intersection(lnBase, ptInt, XPoint()))
|
||
{
|
||
return;
|
||
}
|
||
nAxisDirection=ads_angle(curve.GetCircle().GetCenterPt(), ptInt)+PI/2.0;
|
||
}
|
||
else
|
||
{
|
||
nAxisDirection= curve.IDirection(0);
|
||
}
|
||
|
||
if (nAxisDirection<PI/4 || nAxisDirection>1.75*PI ||
|
||
(nAxisDirection>0.75*PI && nAxisDirection<1.25*PI))
|
||
{
|
||
_tcscpy(szLabStart, _T("A"));
|
||
}
|
||
|
||
// 建立排序的轴网单侧
|
||
XAxisDimSet dimSet(&cvSortBase);
|
||
long ssLen=ssAxis.Length();
|
||
for (long i=0; i<ssLen; i++)
|
||
{
|
||
Entity ent=ssAxis[i];
|
||
dimSet.Append(new XCurveSegment(ent));
|
||
}
|
||
dimSet.QuickSort(XAxisDimSet::SortFunc);
|
||
|
||
if (!(*dimSet.Head() == curve))
|
||
{
|
||
if (cvSortBase.Is(CURVE_CIRCLE))
|
||
{
|
||
adsout << _T("\n发现不能正确分析的轴网!");
|
||
return;
|
||
}
|
||
|
||
if (*dimSet.Tail() == curve)
|
||
{
|
||
dimSet.Reverse();
|
||
XAxisDimSet::g_AntiClockWise=FALSE;
|
||
}
|
||
else
|
||
{
|
||
adsout << _T("\n所选择的不是起始轴线!");
|
||
return;
|
||
}
|
||
}
|
||
|
||
AcDbObjectId idDimStyle=InitDimStyle(bRadian? DS_ANGLE : DS_LINEAR);
|
||
TDbAxisLabelSet *pAxisDim=new TDbAxisLabelSet;
|
||
pAxisDim->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pAxisDim->ConvertFrom(dimSet);
|
||
double nOldLen=pAxisDim->GetLeaderLen(0, TRUE);
|
||
if (pAxisDim->IsArcAxisNet() && pAxisDim->IsArcAxis())
|
||
{
|
||
pAxisDim->SetLeaderLen(0, nOldLen+10.0, TRUE); //圆弧轴网的进深标注, 引线需要加长
|
||
pAxisDim->SetLeaderLen(1, nOldLen+10.0, TRUE); //圆弧轴网的进深标注, 引线需要加长
|
||
}
|
||
|
||
int nLabelFlag=0, nDimFlag=0;
|
||
AcDbObjectId idPrevLink;
|
||
if (curve.Is(CURVE_CIRCLE))
|
||
{
|
||
XString szBackup;
|
||
szBackup=szLabStart;
|
||
adsout << _T("\n请输入起始轴号(.空号)<") << szLabStart << _T(">: ");
|
||
if (ads_getstring(0, _T(""), szLabStart) == RTNORM)
|
||
{
|
||
if (_tcscmp(szLabStart, _T(".")) == 0)
|
||
{
|
||
_tcscpy(szLabStart, _T(""));
|
||
}
|
||
else if (!szLabStart[0])
|
||
{
|
||
_tcscpy(szLabStart, szBackup);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CDimAxisLabelDlg dlg(acedGetAcadFrame());
|
||
dlg.m_bPrevLink=FALSE;
|
||
dlg.m_csLabel=szLabStart;
|
||
if (bRadian)
|
||
{
|
||
int nSide=pAxisDim->OnWhichSide(ptPick);
|
||
dlg.m_dimFlag=nSide? 1 : 0;
|
||
dlg.m_labelFlag=nSide? 0 : 1;
|
||
}
|
||
else
|
||
{
|
||
//modified by whl
|
||
//dlg.m_dimFlag=0;
|
||
//dlg.m_labelFlag=0;
|
||
dlg.m_dimFlag=2;
|
||
dlg.m_labelFlag=2;
|
||
}
|
||
|
||
{
|
||
CTemporaryResourceOverride vTemp;
|
||
if (dlg.DoModal()!=IDOK)
|
||
{
|
||
delete pAxisDim;
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (dlg.m_bPrevLink)
|
||
{
|
||
Entity entPrev;
|
||
ads_sssetfirst(NULL, NULL);
|
||
if (entPrev.FilterSelect(_T("\n点取前接轴号<退出>:"), RBList(RTDXF0, _T("ATS_AXIS_LABEL"),NULL))!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
acdbGetObjectId(idPrevLink, entPrev);
|
||
}
|
||
else
|
||
{
|
||
_tcscpy(szLabStart, dlg.m_csLabel);
|
||
}
|
||
nLabelFlag=dlg.m_labelFlag;
|
||
nDimFlag=dlg.m_dimFlag;
|
||
}
|
||
|
||
if (!idPrevLink)
|
||
{
|
||
pAxisDim->SortAxisLabel(szLabStart);
|
||
}
|
||
|
||
AcDbObjectId idDimLay=InitLayer(LAY_DIMAX, TRUE);
|
||
AcDbObjectId idTextLay=InitLayer(LAY_AXIS_TEXT, TRUE);
|
||
if (curve.Is(CURVE_CIRCLE))
|
||
{
|
||
pAxisDim->HideSide(1);
|
||
TAxisLabelEdJig jig(pAxisDim);
|
||
jig.SetPrompt(_T("\n请输入标注位置<退出>:"));
|
||
if (jig.DoIt()!=RTNORM)
|
||
{
|
||
delete pAxisDim;
|
||
|
||
return;
|
||
}
|
||
if (pAxisDim->GetAxisNum()>1)
|
||
{
|
||
TDbDimension2 *pDim1=new TDbDimension2;
|
||
TDbDimension2 *pDim2=new TDbDimension2;
|
||
pDim1->SetLayoutRotation(Ucs2Wcs(0));//add by whl on 070306
|
||
pDim2->SetLayoutRotation(Ucs2Wcs(0));//add by whl on 070306
|
||
pDim1->SetStyleId(idDimStyle);
|
||
pDim2->SetStyleId(idDimStyle);
|
||
if (pAxisDim->GetDimension(0, *pDim1, *pDim2))
|
||
{
|
||
pDim1->setLayer(idDimLay);
|
||
pDim2->setLayer(idDimLay);
|
||
AddToModelSpace(pDim1,Adesk::kTrue);
|
||
AddToModelSpace(pDim2,Adesk::kTrue);
|
||
|
||
}
|
||
else
|
||
{
|
||
delete pDim1;
|
||
delete pDim2;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int nSidePick=pAxisDim->OnWhichSide(ptPick);
|
||
if (nLabelFlag!=2)
|
||
{
|
||
if (nLabelFlag == 0)
|
||
{
|
||
pAxisDim->HideSide(1-nSidePick);
|
||
}
|
||
else
|
||
{
|
||
pAxisDim->HideSide(nSidePick);
|
||
}
|
||
}
|
||
|
||
//Modify on 2002/2/22 by ZJQ, 解决弧线标注的半径未能设置在相关的轴线的半径
|
||
// 增加扇形的标注半径
|
||
XAxisPickSet ssOpp(SS_FREE);
|
||
double nRadMin=0.0, nRadMax=0.0;
|
||
if (bRadian)
|
||
{
|
||
nRadMin=nRadMax=cvSortBase.GetArc().GetRadius();
|
||
ssOpp.GetFromOppsite(curve, FILT_CIRARC_ONLY);
|
||
long lNum=ssOpp.Length();
|
||
for (long idx=0L; idx<lNum; idx++)
|
||
{
|
||
Entity ent=ssOpp[idx];
|
||
XCurveSegment segTemp(ent);
|
||
if (segTemp.Is(CURVE_ARC))
|
||
{
|
||
if (idx == 0)
|
||
{
|
||
nRadMin=nRadMax=segTemp.GetArc().GetRadius();
|
||
}
|
||
else
|
||
{
|
||
nRadMax=max(nRadMax, segTemp.GetArc().GetRadius());
|
||
nRadMin=min(nRadMin, segTemp.GetArc().GetRadius());
|
||
}
|
||
}
|
||
else if (segTemp.Is(CURVE_CIRCLE))
|
||
{
|
||
if (idx == 0)
|
||
{
|
||
nRadMin=nRadMax=segTemp.GetCircle().GetRadius();
|
||
}
|
||
else
|
||
{
|
||
nRadMax=max(nRadMax, segTemp.GetCircle().GetRadius());
|
||
nRadMin=min(nRadMin, segTemp.GetCircle().GetRadius());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// End
|
||
|
||
if (pAxisDim->GetAxisNum()>1)
|
||
{
|
||
for (int nSide=0; nSide<2; nSide++)
|
||
{
|
||
if (nDimFlag == 0 && nSide!=nSidePick)
|
||
{
|
||
continue;
|
||
}
|
||
else if (nDimFlag == 1 && nSide == nSidePick)
|
||
{
|
||
continue;
|
||
}
|
||
TDbDimension2 *pDim1=new TDbDimension2;
|
||
TDbDimension2 *pDim2=new TDbDimension2;
|
||
pDim1->SetLayoutRotation(Ucs2Wcs(0));//add by whl on 070306
|
||
pDim2->SetLayoutRotation(Ucs2Wcs(0));//add by whl on 070306
|
||
pDim1->SetStyleId(idDimStyle);
|
||
pDim2->SetStyleId(idDimStyle);
|
||
if (pAxisDim->GetDimension(nSide, *pDim1, *pDim2))
|
||
{
|
||
// Modify on 2002/2/22 by ZJQ, 解决弧线标注的半径未能设置在相关的轴线的半径
|
||
if (bRadian)
|
||
{
|
||
//弧线轴网的开间标注
|
||
pDim1->SetObjRadius(nSide? nRadMax : nRadMin);
|
||
pDim2->SetObjRadius(nSide? nRadMax : nRadMin);
|
||
} // End
|
||
|
||
pDim1->setLayer(idDimLay);
|
||
pDim2->setLayer(idDimLay);
|
||
AddToModelSpace(pDim1,Adesk::kTrue);
|
||
AddToModelSpace(pDim2,Adesk::kTrue);
|
||
}
|
||
else
|
||
{
|
||
delete pDim1;
|
||
delete pDim2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (pAxisDim->IsValid())
|
||
{
|
||
pAxisDim->SetTextLayerId(idTextLay);
|
||
pAxisDim->SetLayoutRotation(Ucs2Wcs(0.0));//modified by whl
|
||
pAxisDim->AddToMSpace(Adesk::kFalse);
|
||
if (!!idPrevLink)
|
||
{
|
||
pAxisDim->SetPrevLink(idPrevLink);
|
||
}
|
||
pAxisDim->close();
|
||
}
|
||
else
|
||
{
|
||
delete pAxisDim;
|
||
}
|
||
}
|
||
|
||
void DimAxisBy2Curve0()
|
||
{
|
||
XAxisDimSet::g_AntiClockWise=TRUE;
|
||
InitLayer(LAY_DIMAX, TRUE);
|
||
|
||
XAxisDimSet::g_AntiClockWise = 1; //默认逆时针方向
|
||
Entity entFirst, entFinal;
|
||
XPoint ptPick1, ptPick2;
|
||
|
||
RBList mask(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL);
|
||
if (SelectEntity1(_T("\n请选择起始轴线<退出>:"), entFirst, ptPick1, mask)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
if (entFinal.FilterSelect1(GetPickBoxWcs()/2, _T("\n请选择终止轴线<退出>:"), mask, ptPick2)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
if (entFirst == entFinal)
|
||
{
|
||
return;
|
||
}
|
||
ptPick1=Ucs2Wcs(ptPick1);
|
||
ptPick2=Ucs2Wcs(ptPick2);
|
||
|
||
XCurveSegment curveFirst(entFirst);
|
||
XCurveSegment curveFinal(entFinal);
|
||
if (curveFirst.GetCurveType()!=curveFinal.GetCurveType())
|
||
{
|
||
return;
|
||
}
|
||
|
||
BOOL bRadian=FALSE, bCirAngular=FALSE;
|
||
XPoint ptAxisNetCen;
|
||
if (curveFirst.Is(CURVE_LINE)
|
||
&& (!CT_IsSameDrt(curveFirst.IDirection(0), curveFinal.IDirection(0), _angSnap)
|
||
|| (curveFirst.StartPoint()&curveFinal)!=PR_OUTSIDE))
|
||
{
|
||
PickSet ssTemp(SS_FREE);
|
||
|
||
TADSGePoint3d pt1(Wcs2Ucs(curveFirst.StartPoint())),
|
||
pt2(Wcs2Ucs(curveFirst.EndPoint()));
|
||
|
||
RBList rbFence=ads_buildlist(RT3DPOINT, &pt1,
|
||
RT3DPOINT, &pt2, NULL);
|
||
bCirAngular=(ssTemp.Get(_T("F"), rbFence, NULL,
|
||
RBList(RTDXF0, _T("CIRCLE"), 8, LAY_AXIS, NULL)) == RTNORM);
|
||
bRadian=TRUE;
|
||
if ((curveFirst.StartPoint()&curveFinal)!=PR_OUTSIDE)
|
||
{
|
||
ptAxisNetCen = curveFirst.StartPoint() + curveFirst.EndPoint()
|
||
+ curveFinal.StartPoint() + curveFinal.EndPoint();
|
||
ptAxisNetCen /= 4.0;
|
||
}
|
||
else
|
||
{
|
||
XLine ln1=curveFirst.GetLine();
|
||
XLine ln2=curveFinal.GetLine();
|
||
ln1.SetLineFlag(LS_INFINITE);
|
||
ln2.SetLineFlag(LS_INFINITE);
|
||
ln1.Intersection(&ln2, ptAxisNetCen);
|
||
}
|
||
int nAnswer=YesNoQuestion(_T("\n是否为按逆时针方向排序编号"));
|
||
if (nAnswer == RTCAN)
|
||
{
|
||
return;
|
||
}
|
||
if (nAnswer == Q_NO)
|
||
{
|
||
XAxisDimSet::g_AntiClockWise=FALSE;
|
||
}
|
||
else
|
||
{
|
||
XAxisDimSet::g_AntiClockWise=TRUE;
|
||
}
|
||
}
|
||
XAxisPickSet ssAxis(SS_FREE);
|
||
if (bRadian && !XAxisDimSet::g_AntiClockWise)
|
||
{
|
||
ssAxis.GetFrom2Curve(curveFinal, curveFirst);
|
||
}
|
||
else
|
||
{
|
||
ssAxis.GetFrom2Curve(curveFirst, curveFinal);
|
||
}
|
||
|
||
if (!ssAxis)
|
||
{
|
||
adsout << _T("\n不能找到轴网!");
|
||
return ;
|
||
}
|
||
|
||
ssAxis.Redraw(3);
|
||
|
||
XPoint ptAxisEnd=curveFirst.NearPoint(ptPick1);
|
||
XCurveSegment cvSortBase; //排序的基线
|
||
|
||
if (!bRadian)
|
||
{
|
||
if (curveFirst.Is(CURVE_CIRCLE))
|
||
{
|
||
Entity entBase;
|
||
if (entBase.FilterSelect(_T("\n请选择圆形轴网的横(径)线:"), RBList(RTDXF0, _T("LINE"), 8, LAY_AXIS, NULL)) != RTNORM)
|
||
{
|
||
ssAxis.Redraw(4);
|
||
|
||
return;
|
||
}
|
||
cvSortBase = XCurveSegment(entBase);
|
||
}
|
||
else
|
||
{
|
||
double nDist2Me=curveFirst.GetDist2Me(curveFinal.StartPoint());
|
||
cvSortBase.StartPoint()=curveFirst.StartPoint();
|
||
ads_polar(curveFirst.StartPoint(), curveFirst.IDirection(0)-PI/2.0, nDist2Me, cvSortBase.EndPoint());
|
||
cvSortBase.SetBulge(0.0);
|
||
//cvSortBase.Make();
|
||
}
|
||
}
|
||
else if (bCirAngular)
|
||
{
|
||
//圆形轴网角度标注
|
||
cvSortBase=XCircle(ptAxisNetCen, ptAxisNetCen.Distance2d(curveFirst.FarPoint(ptAxisNetCen)));
|
||
}
|
||
else
|
||
{
|
||
double nAng1=ads_angle(ptAxisNetCen, curveFirst.FarPoint(ptAxisNetCen));
|
||
double nAng2=ads_angle(ptAxisNetCen, curveFinal.FarPoint(ptAxisNetCen));
|
||
if (XAxisDimSet::g_AntiClockWise == FALSE)
|
||
{
|
||
Exchange(nAng1, nAng2);
|
||
}
|
||
cvSortBase = XArc(ptAxisNetCen, ptAxisNetCen.Distance2d(curveFirst.FarPoint(ptAxisNetCen)),
|
||
nAng1, nAng2);
|
||
}
|
||
|
||
// Add on 2002/6/14, 解决圆形轴网起始轴角度不是最小时无法标注的问题
|
||
double nVal=XAxisDimSet::g_nAngleBegin;
|
||
if (cvSortBase.Is(CURVE_CIRCLE))
|
||
{
|
||
nVal=ads_angle(ptAxisNetCen, curveFirst.FarPoint(ptAxisNetCen));
|
||
}
|
||
XPushMemVar<double> vTemp1(XAxisDimSet::g_nAngleBegin, nVal);
|
||
|
||
DimAxisLabel(curveFirst, cvSortBase, ssAxis, ptPick1, bRadian);
|
||
ssAxis.Redraw(4);
|
||
}
|
||
|
||
void AutoLabelAxisArg(BOOL bRadian)
|
||
{
|
||
XAxisDimSet::g_AntiClockWise=TRUE;
|
||
InitLayer(LAY_DIMAX, TRUE);
|
||
|
||
XAxisDimSet::g_AntiClockWise = 1; //默认逆时针方向
|
||
Entity entFirst;
|
||
XPoint ptPick;
|
||
|
||
const TCHAR *pszDxf=bRadian? _T("LINE") : _T("LINE,ARC,CIRCLE");
|
||
RBList mask(RTDXF0, pszDxf, 8, LAY_AXIS, NULL);
|
||
if (SelectEntity((bRadian?
|
||
_T("\n请选择起始轴线(弧线轴网的径线)<退出>:")
|
||
: _T("\n请选择起始轴线(直线轴网的轴线或弧线轴网的弧线)<退出>"))
|
||
, entFirst, ptPick, mask)!=RTNORM)
|
||
{
|
||
return ;
|
||
}
|
||
ptPick=Ucs2Wcs(ptPick);
|
||
|
||
XCurveSegment curve(entFirst);
|
||
int nFiltFlag=0;
|
||
if (bRadian)
|
||
{
|
||
nFiltFlag |= FILT_RADIATE_LINE;
|
||
}
|
||
else if (curve.Is(CURVE_LINE))
|
||
{
|
||
nFiltFlag |= FILT_LINE_ONLY;
|
||
}
|
||
else
|
||
{
|
||
nFiltFlag |= FILT_CIRARC_ONLY;
|
||
}
|
||
XAxisPickSet ssAxis(entFirst, nFiltFlag);
|
||
if (!ssAxis)
|
||
{
|
||
adsout << _T("\n不能找到轴网!");
|
||
return ;
|
||
}
|
||
|
||
//另外正交方向的一组轴线
|
||
XAxisPickSet &ssOppsite = *ssAxis.GetOppsite();
|
||
if (!ssOppsite)
|
||
{
|
||
adsout << _T("\n不能找到轴网!");
|
||
|
||
return ;
|
||
}
|
||
|
||
XPoint ptAxisEnd=curve.NearPoint(ptPick);
|
||
XCurveSegment cvSortBase; //排序的基线
|
||
XPoint ptAxisNetCen;
|
||
|
||
Entity entSortBase;
|
||
if (!GetClosestAxis(ssOppsite, curve.Is(CURVE_CIRCLE)? ptPick : ptAxisEnd, entSortBase))
|
||
{
|
||
adsout << _T("\n找不到最近的另一侧轴线!");
|
||
|
||
return ;
|
||
}
|
||
|
||
cvSortBase = XCurveSegment(entSortBase);
|
||
if (!cvSortBase)
|
||
{
|
||
adsout << _T("\n不能取得排序轴线!");
|
||
|
||
return ;
|
||
}
|
||
|
||
|
||
if (ssAxis.IsArcAxis() && curve.Is(CURVE_LINE))
|
||
{
|
||
//弧形轴网开间
|
||
if (cvSortBase.Is(CURVE_ARC))
|
||
{
|
||
ptAxisNetCen=cvSortBase.GetArc().GetCenterPt();
|
||
}
|
||
else if (cvSortBase.Is(CURVE_CIRCLE))
|
||
{
|
||
//标注圆形轴网的开间
|
||
ptAxisNetCen=cvSortBase.GetCircle().GetCenterPt();
|
||
XAxisDimSet::g_nAngleBegin=ads_angle(ptAxisNetCen, curve.FarPoint(ptAxisNetCen));
|
||
int nAnswer=YesNoQuestion(_T("\n是否为按逆时针方向排序编号"));
|
||
if (nAnswer == RTCAN)
|
||
{
|
||
return;
|
||
}
|
||
if (nAnswer == Q_NO)
|
||
{
|
||
XAxisDimSet::g_AntiClockWise=FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!curve.Is(CURVE_CIRCLE))
|
||
{
|
||
// 把cvSortBase偏移到 ptAxisEnd
|
||
int nOffSide=cvSortBase.OnWhichSide(ptAxisEnd);
|
||
XPoint ptPrjToSortBase;
|
||
//不是标注弧形轴网的进深
|
||
if (curve.Is(CURVE_LINE) && cvSortBase.ProjectToMe(ptAxisEnd, ptPrjToSortBase) == RTNORM)
|
||
{
|
||
cvSortBase = cvSortBase.Offset(nOffSide, ptAxisEnd.Distance(ptPrjToSortBase), LS_FINITE);
|
||
}
|
||
}
|
||
|
||
ssAxis.Redraw(3);
|
||
DimAxisLabel(curve, cvSortBase, ssAxis, ptPick, bRadian);
|
||
ssAxis.Redraw(4);
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:轴网标注(矩形轴网和圆弧轴网的弧线)
|
||
void AutoLabelAxis()
|
||
{
|
||
AutoLabelAxisArg(FALSE);
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:角注轴网(圆弧轴网的径线)
|
||
void AutoLabelAxisAngle()
|
||
{
|
||
AutoLabelAxisArg(TRUE);
|
||
}
|
||
|
||
static XPoint g_ptRef;
|
||
static int CompareDimDist(const Entity *p1, const Entity *p2)
|
||
{
|
||
double nDist1=0.0, nDist2=0.0;
|
||
Entity en1=*p1;
|
||
OPENOBJ_BEGIN(en1, AcDb::kForRead, TDbDimension2, pDim1);
|
||
if (pDim1)
|
||
{
|
||
XCurveSegment cvDim=pDim1->GetDimCurve();
|
||
cvDim.SetLineFlag(LS_INFINITE);
|
||
XPoint ptPrj;
|
||
cvDim.ProjectToMe(g_ptRef, ptPrj);
|
||
nDist1=ptPrj.Distance2d(g_ptRef);
|
||
}
|
||
OPENOBJ_END();
|
||
Entity en2=*p2;
|
||
OPENOBJ_BEGIN(en2, AcDb::kForRead, TDbDimension2, pDim2);
|
||
if (pDim2)
|
||
{
|
||
XCurveSegment cvDim=pDim2->GetDimCurve();
|
||
cvDim.SetLineFlag(LS_INFINITE);
|
||
XPoint ptPrj;
|
||
cvDim.ProjectToMe(g_ptRef, ptPrj);
|
||
nDist2=ptPrj.Distance2d(g_ptRef);
|
||
}
|
||
OPENOBJ_END();
|
||
if (nDist1<nDist2)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
//////////////////////////////////
|
||
// bRadian: 0--直线轴号; 1--角度轴号
|
||
void InsAxisArg(BOOL bRadian)
|
||
{
|
||
Entity entRefAxis;
|
||
RBList mask(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL);
|
||
XPoint ptPick;
|
||
if (SelectEntity((bRadian ? _T("\n选择参考轴线(弧线轴网的径线)<退出>:")
|
||
: _T("\n选择参考轴线(直线轴网的轴线或弧线轴网的弧线)<退出>:"))
|
||
, entRefAxis, ptPick, mask) != RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
ptPick=Ucs2Wcs(ptPick);
|
||
int nAnswer=YesNoQuestion(_T("\n新增轴线是否为附加轴线"), Q_NO);
|
||
if (nAnswer == RTCAN)
|
||
{
|
||
return ;
|
||
}
|
||
|
||
XCurveSegment cv(entRefAxis);
|
||
XCurveSegment curve=cv;
|
||
|
||
int nFiltFlag=0;
|
||
if (bRadian)
|
||
{
|
||
nFiltFlag |= FILT_RADIATE_LINE;
|
||
}
|
||
else if (curve.Is(CURVE_LINE))
|
||
{
|
||
nFiltFlag |= FILT_LINE_ONLY;
|
||
}
|
||
else
|
||
{
|
||
nFiltFlag |= FILT_CIRARC_ONLY;
|
||
}
|
||
|
||
XAxisPickSet ssAxis(entRefAxis, nFiltFlag);
|
||
if (!ssAxis)
|
||
{
|
||
adsout << _T("\n请正确选择!");
|
||
|
||
return;
|
||
}
|
||
VERIFY(curve.ProjectToMe(XPoint(ptPick), ptPick) == RTNORM);
|
||
XPoint ptAxisEnd=curve.NearPoint(ptPick);
|
||
|
||
// 取得标志
|
||
XAxisPickSet &ssOpp = *ssAxis.GetOppsite();
|
||
|
||
// 矩形轴网或没有信息的轴线
|
||
if (!ssAxis.IsArcAxis())
|
||
{
|
||
XPoint ptBase;
|
||
cv.ProjectToMe(ptPick, ptBase);
|
||
XPoint ptSide;
|
||
ads_real nOffset;
|
||
if (ads_getpoint(Wcs2Ucs(ptPick), _T("\n偏移方向<退出>: "), ptSide)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
ptSide=Ucs2Wcs(ptSide);
|
||
ads_initget(RSG_NONEG|RSG_NOZERO, NULL);
|
||
if (ads_getdist(Wcs2Ucs(ptPick), _T("\n距参考轴线的距离<退出>: "), &nOffset)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
int nSide=cv.OnWhichSide(ptSide);
|
||
XCurveSegment cvNew = cv.Offset(nSide, nOffset, LS_FINITE);
|
||
if (!cvNew)
|
||
{
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
cvNew.MakeEntity(entRefAxis);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (cv.Is(CURVE_LINE))
|
||
{
|
||
XPoint ptRotBase; //弧网圆心
|
||
if (!ssOpp) ptRotBase=cv.StartPoint();
|
||
else
|
||
{
|
||
Entity entOneAxis=ssOpp[0L];
|
||
assert(!entOneAxis.Is(_T("LINE")));
|
||
XCircle cirOrArc(entOneAxis);
|
||
ptRotBase = cirOrArc.GetCenterPt();
|
||
}
|
||
if (cv.GetLine().MakeEntity(&entRefAxis) == RTNORM)
|
||
{
|
||
Entity entNew;
|
||
entNew.GetLast();
|
||
XPoint ptPick0;
|
||
cv.ProjectToMe(ptPick, ptPick0);
|
||
if (DragRotation(entNew, _T("\n输入转角<退出>:"), Wcs2Ucs(ptRotBase), Wcs2Ucs(ptPick0))!=RTNORM)
|
||
{
|
||
entNew.Delete();
|
||
return ;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (cv.MakeEntity(entRefAxis) == RTNORM)
|
||
{
|
||
Entity entNew;
|
||
entNew.GetLast();
|
||
if (DragRadius(entNew, _T("\n输入半径<退出>:"), Wcs2Ucs(ptPick))!=RTNORM)
|
||
{
|
||
entNew.Delete();
|
||
return ;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//修改标记
|
||
Entity entNewAxis;
|
||
entNewAxis.GetLast();
|
||
|
||
XCurveSegment segNew(entNewAxis);
|
||
PickSet ssLabelSet(SS_FREE);
|
||
PickSet ssOnStart(SS_FREE);
|
||
double nOffset=GetPickBoxWcs();
|
||
XPoint ptOffset(nOffset, nOffset);
|
||
XPoint pt1=cv.StartPoint()+ptOffset;
|
||
XPoint pt2=cv.StartPoint() - ptOffset;
|
||
if (ssOnStart.Get(_T("C"), pt1, pt2, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) == RTNORM)
|
||
{
|
||
if (ssOnStart.Length() == 1)
|
||
{
|
||
Entity entLabelSet=ssOnStart[0L];
|
||
ssLabelSet += entLabelSet;
|
||
}
|
||
}
|
||
|
||
pt1=cv.EndPoint()+ptOffset;
|
||
pt2=cv.EndPoint() - ptOffset;
|
||
if (ssOnStart.Get(_T("C"), pt1, pt2, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) == RTNORM)
|
||
{
|
||
if (ssOnStart.Length() == 1)
|
||
{
|
||
Entity entLabelSet=ssOnStart[0L];
|
||
ssLabelSet += entLabelSet;
|
||
}
|
||
}
|
||
|
||
if (!ssLabelSet)
|
||
{
|
||
return;
|
||
}
|
||
PickSet ssDim1(SS_FREE), ssDim2(SS_FREE);
|
||
RBList rbDimMask(RTDXF0, _T("ATS_DIMENSION2"), NULL);
|
||
long num=ssLabelSet.Length();
|
||
double nPrec=GetPickBoxWcs();
|
||
BOOL bGetDim1=FALSE, bGetDim2=FALSE;
|
||
for (long i=0; i<num; i++)
|
||
{
|
||
Entity entLabelSet=ssLabelSet[i];
|
||
AcDbVoidPtrArray entSet;
|
||
XExplodeStream dc(entSet);
|
||
OPENOBJ_BEGIN(entLabelSet, AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
pSet->ExplodeOrDraw2d(dc);
|
||
pSet->AddAxis(segNew, nAnswer == Q_YES, NULL);
|
||
OPENOBJ_END();
|
||
int nCount=entSet.length();
|
||
for (int n=0; n<nCount; n++)
|
||
{
|
||
AcDbEntity *pEnt=(AcDbEntity *)entSet[n];
|
||
if (pEnt->isA() == AcDbLine::desc())
|
||
{
|
||
XPoint pt1, pt2;
|
||
AcDbLine *pLine=AcDbLine::cast(pEnt);
|
||
pLine->getStartPoint(pt1);
|
||
pLine->getEndPoint(pt2);
|
||
if (pt1.Distance2d(cv.StartPoint())<nPrec || pt2.Distance2d(cv.StartPoint())<nPrec)
|
||
{
|
||
AssureOnScreen(pt1, pt2);
|
||
bGetDim1=TRUE;
|
||
RBList rbFence=ads_buildlist(RT3DPOINT, &pt1, RT3DPOINT, &pt2, NULL);
|
||
ssDim1.Get(_T("F"), rbFence, NULL, rbDimMask);
|
||
}
|
||
else if (pt1.Distance2d(cv.EndPoint())<nPrec || pt2.Distance2d(cv.EndPoint())<nPrec)
|
||
{
|
||
AssureOnScreen(pt1, pt2);
|
||
bGetDim2=TRUE;
|
||
RBList rbFence=ads_buildlist(RT3DPOINT, &pt1, RT3DPOINT, &pt2, NULL);
|
||
ssDim2.Get(_T("F"), rbFence, NULL, rbDimMask);
|
||
}
|
||
}
|
||
}
|
||
ReleaseEntSet(entSet);
|
||
}
|
||
if (bGetDim1 && !!ssDim1)
|
||
{
|
||
DList<Entity> lstDim1;
|
||
long lDim1=ssDim1.Length();
|
||
for (long idx=0L; idx<lDim1; idx++)
|
||
{
|
||
Entity *pEnt=new Entity;
|
||
*pEnt=ssDim1[idx];
|
||
lstDim1.Append(pEnt);
|
||
}
|
||
g_ptRef=cv.StartPoint();
|
||
lstDim1.QuickSort(CompareDimDist);
|
||
if (lDim1 == 2)
|
||
{
|
||
Entity entDim=*lstDim1[0];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim1);
|
||
if (pDim1)
|
||
{
|
||
pDim1->AddSegment(segNew.StartPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if (lDim1>2)
|
||
{
|
||
for (int j=0; j<2; j++)
|
||
{
|
||
Entity entDim=*lstDim1[j];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim1);
|
||
if (pDim1)
|
||
{
|
||
pDim1->AddSegment(segNew.StartPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
}
|
||
if (bGetDim2 && !!ssDim2)
|
||
{
|
||
DList<Entity> lstDim2;
|
||
long lDim2=ssDim2.Length();
|
||
for (long idx=0L; idx<lDim2; idx++)
|
||
{
|
||
Entity *pEnt=new Entity;
|
||
*pEnt=ssDim2[idx];
|
||
lstDim2.Append(pEnt);
|
||
}
|
||
g_ptRef=cv.EndPoint();
|
||
lstDim2.QuickSort(CompareDimDist);
|
||
if (lDim2 == 2)
|
||
{
|
||
Entity entDim=*lstDim2[0];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim2);
|
||
if (pDim2)
|
||
{
|
||
pDim2->AddSegment(segNew.EndPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if (lDim2>2)
|
||
{
|
||
for (int j=0; j<2; j++)
|
||
{
|
||
Entity entDim=*lstDim2[j];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim2);
|
||
if (pDim2)
|
||
{
|
||
pDim2->AddSegment(segNew.EndPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:添加轴线
|
||
void InsAxis()
|
||
{
|
||
|
||
Entity entRefAxis;
|
||
RBList mask(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL);
|
||
XPoint ptPick;
|
||
if (SelectEntity(_T("\n选择参考轴线 <退出>:") ,entRefAxis, ptPick, mask)!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
int old(0);
|
||
TGGetVar(_T("ORTHOMODE"), &old);
|
||
|
||
do // add by gjm 2014/05/12
|
||
{
|
||
ptPick=Ucs2Wcs(ptPick);
|
||
XCurveSegment cv(entRefAxis);
|
||
XCurveSegment curve=cv;
|
||
|
||
XAxisPickSet *pAxisSS=NULL;
|
||
DList<XAxisPickSet> lstAxisSS;//用于自动delete
|
||
if (curve.Is(CURVE_LINE))
|
||
{
|
||
TGSetVar(_T("ORTHOMODE"), 1);
|
||
pAxisSS=new XAxisPickSet(entRefAxis,FILT_RADIATE_LINE);
|
||
lstAxisSS.Append(pAxisSS);
|
||
if (!(*pAxisSS))
|
||
{
|
||
pAxisSS=new XAxisPickSet(entRefAxis,FILT_LINE_ONLY);
|
||
lstAxisSS.Append(pAxisSS);
|
||
if (!(*pAxisSS))
|
||
{
|
||
adsout << _T("\n请正确选择!");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else //弧线
|
||
{
|
||
pAxisSS = new XAxisPickSet(entRefAxis,FILT_CIRARC_ONLY);
|
||
lstAxisSS.Append(pAxisSS);
|
||
if (!(*pAxisSS))
|
||
{
|
||
adsout << _T("\n请正确选择!");
|
||
break;
|
||
}
|
||
}
|
||
|
||
XAxisPickSet &ssAxis=*pAxisSS;
|
||
|
||
int nAnswer=YesNoQuestion(_T("\n新增轴线是否为附加轴线"), Q_NO);
|
||
if (nAnswer == RTCAN)
|
||
{
|
||
break;
|
||
}
|
||
|
||
VERIFY(curve.ProjectToMe(XPoint(ptPick), ptPick) == RTNORM);
|
||
XPoint ptAxisEnd=curve.NearPoint(ptPick);
|
||
|
||
// 取得标志
|
||
XAxisPickSet &ssOpp = *ssAxis.GetOppsite();
|
||
|
||
//add by lgy 20120208 是否重排标注
|
||
BOOL bAuto = TRUE;
|
||
if (!ssAxis.IsArcAxis())
|
||
{ // 矩形轴网或没有信息的轴线
|
||
//XPoint ptBase;
|
||
//cv.ProjectToMe(ptPick, ptBase);
|
||
//add by lgy 20120208 是否重排标注根据用户输入
|
||
int nAuto = YesNoQuestion(_T("\n是否重排轴号"), Q_YES);
|
||
if (nAuto == RTCAN)
|
||
{
|
||
break;
|
||
}
|
||
bAuto = (nAuto == Q_YES);
|
||
XPoint ptSide;
|
||
ads_real nOffset;
|
||
//modify by lgy 20120208 新的需求不需要偏移方向而是通过据参考轴线的距离而获得方向
|
||
//if (ads_getpoint(Wcs2Ucs(ptPick), _T("\n偏移方向<退出>: "), ptSide)!=RTNORM)
|
||
//{
|
||
// return;
|
||
//}
|
||
if (ads_getpoint(Wcs2Ucs(ptPick), _T("\n距参考轴线的距离<退出>: "), ptSide)!=RTNORM)
|
||
{
|
||
break;
|
||
}
|
||
ptSide=Ucs2Wcs(ptSide);
|
||
ads_initget(RSG_NONEG|RSG_NOZERO, NULL);
|
||
//modify by lgy 20120208 新的需求不需要偏移方向而是通过据参考轴线的距离而获得方向
|
||
//if (ads_getdist(Wcs2Ucs(ptPick), _T("\n距参考轴线的距离<退出>: "), &nOffset)!=RTNORM)
|
||
//{
|
||
// return;
|
||
//}
|
||
nOffset = cv.GetDist2Me(ptSide);
|
||
nOffset = fabs(nOffset);
|
||
|
||
int nSide=cv.OnWhichSide(ptSide);
|
||
XCurveSegment cvNew = cv.Offset(nSide, nOffset, LS_FINITE);
|
||
if (!cvNew)
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
cvNew.MakeEntity(entRefAxis);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// add by lgy 20120208,是否重排标注根据用户输入
|
||
int nAuto = YesNoQuestion(_T("\n是否重排轴号"), Q_YES);
|
||
if (nAuto == RTCAN)
|
||
{
|
||
break;
|
||
}
|
||
bAuto = (nAuto == Q_YES);
|
||
|
||
if (cv.Is(CURVE_LINE))
|
||
{
|
||
XPoint ptRotBase; //弧网圆心
|
||
if (!ssOpp)
|
||
ptRotBase=cv.StartPoint();
|
||
else
|
||
{
|
||
Entity entOneAxis=ssOpp[0L];
|
||
assert(!entOneAxis.Is(_T("LINE")));
|
||
XCircle cirOrArc(entOneAxis);
|
||
ptRotBase = cirOrArc.GetCenterPt();
|
||
}
|
||
|
||
if (cv.GetLine().MakeEntity(&entRefAxis) == RTNORM)
|
||
{
|
||
Entity entNew;
|
||
entNew.GetLast();
|
||
XPoint ptPick0;
|
||
cv.ProjectToMe(ptPick, ptPick0);
|
||
if (DragRotation(entNew, _T("\n输入转角<退出>:"), Wcs2Ucs(ptRotBase), Wcs2Ucs(ptPick0))!=RTNORM)
|
||
{
|
||
entNew.Delete();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (cv.MakeEntity(entRefAxis) == RTNORM)
|
||
{
|
||
Entity entNew;
|
||
entNew.GetLast();
|
||
if (DragRadius(entNew, _T("\n输入半径<退出>:"), Wcs2Ucs(ptPick))!=RTNORM)
|
||
{
|
||
entNew.Delete();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 修改标记
|
||
Entity entNewAxis;
|
||
entNewAxis.GetLast();
|
||
|
||
XCurveSegment segNew(entNewAxis);
|
||
PickSet ssLabelSet(SS_FREE);
|
||
PickSet ssOnStart(SS_FREE);
|
||
double nOffset=GetPickBoxWcs();
|
||
XPoint ptOffset(nOffset, nOffset);
|
||
XPoint pt1=cv.StartPoint()+ptOffset;
|
||
XPoint pt2=cv.StartPoint() - ptOffset;
|
||
if (ssOnStart.Get(_T("C"), pt1, pt2, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) == RTNORM)
|
||
{
|
||
if (ssOnStart.Length() == 1)
|
||
{
|
||
Entity entLabelSet=ssOnStart[0L];
|
||
ssLabelSet += entLabelSet;
|
||
}
|
||
}
|
||
|
||
pt1=cv.EndPoint()+ptOffset;
|
||
pt2=cv.EndPoint() - ptOffset;
|
||
if (ssOnStart.Get(_T("C"), pt1, pt2, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) == RTNORM)
|
||
{
|
||
if (ssOnStart.Length() == 1)
|
||
{
|
||
Entity entLabelSet=ssOnStart[0L];
|
||
ssLabelSet += entLabelSet;
|
||
}
|
||
}
|
||
|
||
if (!ssLabelSet)
|
||
{
|
||
break;
|
||
}
|
||
PickSet ssDim1(SS_FREE), ssDim2(SS_FREE);
|
||
RBList rbDimMask(RTDXF0, _T("ATS_DIMENSION2"), NULL);
|
||
long num=ssLabelSet.Length();
|
||
double nPrec=GetPickBoxWcs();
|
||
BOOL bGetDim1=FALSE, bGetDim2=FALSE;
|
||
for (long i=0; i<num; i++)
|
||
{
|
||
Entity entLabelSet=ssLabelSet[i];
|
||
AcDbVoidPtrArray entSet;
|
||
XExplodeStream dc(entSet);
|
||
OPENOBJ_BEGIN(entLabelSet, AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
pSet->ExplodeOrDraw2d(dc);
|
||
//modify by lgy 20120208 添加轴线时是否标注重排根据参数
|
||
//pSet->AddAxis(segNew, nAnswer == Q_YES, NULL);
|
||
pSet->AddAxis(segNew, nAnswer == Q_YES, NULL, bAuto);
|
||
OPENOBJ_END();
|
||
int nCount=entSet.length();
|
||
for (int n=0; n<nCount; n++)
|
||
{
|
||
AcDbEntity *pEnt=(AcDbEntity *)entSet[n];
|
||
if (pEnt->isA() == AcDbLine::desc())
|
||
{
|
||
XPoint pt1, pt2;
|
||
AcDbLine *pLine=AcDbLine::cast(pEnt);
|
||
pLine->getStartPoint(pt1);
|
||
pLine->getEndPoint(pt2);
|
||
if (pt1.Distance2d(cv.StartPoint())<nPrec || pt2.Distance2d(cv.StartPoint())<nPrec)
|
||
{
|
||
AssureOnScreen(pt1, pt2);
|
||
bGetDim1=TRUE;
|
||
RBList rbFence=ads_buildlist(RT3DPOINT, &pt1, RT3DPOINT, &pt2, NULL);
|
||
ssDim1.Get(_T("F"), rbFence, NULL, rbDimMask);
|
||
}
|
||
else if (pt1.Distance2d(cv.EndPoint())<nPrec || pt2.Distance2d(cv.EndPoint())<nPrec)
|
||
{
|
||
AssureOnScreen(pt1, pt2);
|
||
bGetDim2=TRUE;
|
||
RBList rbFence=ads_buildlist(RT3DPOINT, &pt1, RT3DPOINT, &pt2, NULL);
|
||
ssDim2.Get(_T("F"), rbFence, NULL, rbDimMask);
|
||
}
|
||
}
|
||
}
|
||
ReleaseEntSet(entSet);
|
||
}
|
||
if (bGetDim1 && !!ssDim1)
|
||
{
|
||
DList<Entity> lstDim1;
|
||
long lDim1=ssDim1.Length();
|
||
for (long idx=0L; idx<lDim1; idx++)
|
||
{
|
||
Entity *pEnt=new Entity;
|
||
*pEnt=ssDim1[idx];
|
||
lstDim1.Append(pEnt);
|
||
}
|
||
g_ptRef=cv.StartPoint();
|
||
lstDim1.QuickSort(CompareDimDist);
|
||
if (lDim1 == 2)
|
||
{
|
||
Entity entDim=*lstDim1[0];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim1);
|
||
if (pDim1)
|
||
{
|
||
pDim1->AddSegment(segNew.StartPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if (lDim1>2)
|
||
{
|
||
for (int j=0; j<2; j++)
|
||
{
|
||
Entity entDim=*lstDim1[j];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim1);
|
||
if (pDim1)
|
||
{
|
||
pDim1->AddSegment(segNew.StartPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
}
|
||
if (bGetDim2 && !!ssDim2)
|
||
{
|
||
DList<Entity> lstDim2;
|
||
long lDim2=ssDim2.Length();
|
||
for (long idx=0L; idx<lDim2; idx++)
|
||
{
|
||
Entity *pEnt=new Entity;
|
||
*pEnt=ssDim2[idx];
|
||
lstDim2.Append(pEnt);
|
||
}
|
||
g_ptRef=cv.EndPoint();
|
||
lstDim2.QuickSort(CompareDimDist);
|
||
if (lDim2 == 2)
|
||
{
|
||
Entity entDim=*lstDim2[0];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim2);
|
||
if (pDim2)
|
||
{
|
||
pDim2->AddSegment(segNew.EndPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if (lDim2>2)
|
||
{
|
||
for (int j=0; j<2; j++)
|
||
{
|
||
Entity entDim=*lstDim2[j];
|
||
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim2);
|
||
if (pDim2)
|
||
{
|
||
pDim2->AddSegment(segNew.EndPoint());
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
}
|
||
|
||
} while (false);
|
||
|
||
TGSetVar(_T("ORTHOMODE"), old);
|
||
}
|
||
|
||
void ExtendToBound(XLine *pLine,DList<XLine> &BoundLine)
|
||
{
|
||
pLine->SetLineFlag(LS_INFINITE);//把线的长度改为无限
|
||
ads_point pt;
|
||
XPoint startPt,endPt;
|
||
int interNum=0;
|
||
for (int i=0;i<4;i++)
|
||
{
|
||
XLine bLine=*BoundLine[i];
|
||
if (pLine->Intersection (&bLine,pt))//如果有交点
|
||
{
|
||
if (interNum == 0)
|
||
{
|
||
startPt=pt;
|
||
interNum=1;
|
||
}
|
||
else
|
||
{
|
||
endPt=pt;
|
||
interNum=2;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (interNum == 2)//如果有两个交点
|
||
{
|
||
pLine->StartPoint() =startPt;
|
||
pLine->EndPoint() =endPt;
|
||
}
|
||
else
|
||
{
|
||
ads_printf(_T("\n计算有误!"));
|
||
}
|
||
pLine->SetLineFlag(LS_FINITE);//变回有限长度;
|
||
}
|
||
//画轴网
|
||
void DrawAxisNet(DList<XLine> &lstLine,DList<XArc> &lstArc,DList<XCircle> &lstCircle)
|
||
{
|
||
int len,i,len1,j;
|
||
XLine *pLine=NULL;
|
||
XWcsStream dc;
|
||
dc.sLayer=LAY_AXIS;
|
||
ads_real angle;
|
||
//开始画矩形轴网
|
||
len=lstLine.Length();
|
||
for (i=0;i<len;i++)
|
||
{
|
||
pLine=lstLine[i];
|
||
angle=pLine->Direction ();
|
||
if (fabs(angle)<0.0001 || fabs(angle-PI)<0.0001 || fabs(angle-2*PI)<0.0001)//如果大致在水平方向,属于进深
|
||
{
|
||
dc<<*pLine;
|
||
}
|
||
}
|
||
for (i=0;i<len;i++)
|
||
{
|
||
pLine=lstLine[i];
|
||
angle=pLine->Direction ();
|
||
if (fabs(angle-PI/2)<0.0001 || fabs(angle-3*PI/2)<0.0001)//如果大致在垂直方向,属于开间
|
||
{
|
||
dc<<*pLine;
|
||
}
|
||
}
|
||
|
||
for (i=0;i<len;i++)
|
||
{
|
||
pLine=lstLine[i];
|
||
angle=pLine->Direction ();
|
||
if (fabs(angle)>=0.0001 && fabs(angle-PI/2)>=0.0001 && fabs(angle-PI)>=0.0001
|
||
&& fabs(angle-PI*3/2)>=0.0001 && fabs(angle-PI*2)>=0.0001)
|
||
{
|
||
dc<<*pLine;
|
||
}
|
||
}
|
||
|
||
//画弧形轴网:必须考虑不同圆心有不同标注
|
||
len=lstArc.Length();
|
||
DList<XPoint> bakofcenter;
|
||
for (i = 0; i < len; i++)//以下的处理是对于同一个圆心的圆弧轴网要求包含的弧度一致(整齐化)
|
||
{
|
||
XArc *pArc=NULL,*pArc1=NULL;
|
||
XPoint center,center1;
|
||
pArc=lstArc[i];
|
||
pArc->Center(center);
|
||
if (i == 0)//第一个:直接加入到使用过的圆心链表
|
||
{
|
||
bakofcenter.Append(new XPoint(center));
|
||
}
|
||
else//其余:检查是否已经使用过
|
||
{
|
||
BOOL isUsedCenter=FALSE;
|
||
len1=bakofcenter.Length();
|
||
for (j=0;j<len1;j++)
|
||
{
|
||
XPoint bak=*bakofcenter[j];
|
||
if (bak == center)
|
||
{
|
||
isUsedCenter=TRUE;
|
||
break;
|
||
}
|
||
}
|
||
if (isUsedCenter)//如果已经使用过,看下一个;
|
||
{
|
||
continue;
|
||
}
|
||
else//否则把这个没有用过的圆心加入到链表中
|
||
{
|
||
bakofcenter.Append(new XPoint(center));
|
||
}
|
||
}
|
||
dc<<*pArc;
|
||
for (j=i+1;j<len;j++)//此循环得到最大范围的起始终止角度
|
||
{
|
||
pArc1=lstArc[j];
|
||
pArc1->Center(center1);
|
||
if (center == center1)
|
||
{
|
||
dc<<*pArc1;
|
||
}
|
||
}
|
||
}
|
||
//画圆轴网:也必须考虑不同圆心有不同标注
|
||
bakofcenter.Reset();
|
||
len=lstCircle.Length();
|
||
for (i=0;i<len;i++)//以下的处理是对于同一个圆心的圆弧轴网要求包含的弧度一致(整齐化)
|
||
{
|
||
XCircle *pCircle=NULL,*pCircle1=NULL;
|
||
XPoint center,center1;
|
||
pCircle=lstCircle[i];
|
||
pCircle->Center(center);
|
||
if (i == 0)//第一个:直接加入到使用过的圆心链表
|
||
{
|
||
bakofcenter.Append(new XPoint(center));
|
||
}
|
||
else//其余:检查是否已经使用过
|
||
{
|
||
BOOL isUsedCenter=FALSE;
|
||
len1=bakofcenter.Length();
|
||
for (j=0;j<len1;j++)
|
||
{
|
||
XPoint bak=*bakofcenter[j];
|
||
if (bak == center)
|
||
{
|
||
isUsedCenter=TRUE;
|
||
break;
|
||
}
|
||
}
|
||
if (isUsedCenter)//如果已经使用过,看下一个;
|
||
{
|
||
continue;
|
||
}
|
||
else//否则把这个没有用过的圆心加入到链表中
|
||
{
|
||
bakofcenter.Append(new XPoint(center));
|
||
}
|
||
}
|
||
|
||
dc<<*pCircle;
|
||
for (j=i+1;j<len;j++)
|
||
{
|
||
pCircle1=lstCircle[i];
|
||
dc<<*pCircle1;
|
||
}
|
||
}
|
||
}
|
||
|
||
//考虑弧线墙以及圆墙?以成员bulge为准,如果它为2PI那么是圆,起点终点是直径的端点
|
||
//如果是0,就是直线?如果为一个正数,是一段弧,该弧如何计算?
|
||
//如果存在一个微小的角度该如何处理?弧段不能拉通到边界上又该如何?
|
||
void GenerateAxisNet(PickSet &Set,DList<XLine> &BoundLine,ads_real precision,ads_real anglespace)
|
||
{
|
||
long len,i,len1,j;
|
||
Entity ent;
|
||
XPoint Startpt,Endpt,pt;
|
||
ads_real angle,angle1;
|
||
DList<XLine> lstLine;
|
||
DList<XArc> lstArc;
|
||
DList<XCircle> lstCircle;
|
||
|
||
len=Set.Length ();
|
||
for (i=0;i<len;i++)
|
||
{
|
||
ent=Set[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWall, pWall);
|
||
if (!pWall || !pWall->IsValid())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
//bulge=pWall->bulge ;
|
||
if (pWall->Is(CURVE_LINE))
|
||
{
|
||
//直线
|
||
XLine ln=pWall->GetLine();
|
||
ln.SetElevation (0.0);
|
||
ExtendToBound(&ln,BoundLine);
|
||
len1=lstLine.Length();
|
||
angle=ln.Direction();
|
||
BOOL canAdd=TRUE;
|
||
for (j=0;j<len1;j++)
|
||
{
|
||
XLine *pLine1=lstLine[j];
|
||
angle1=pLine1->Direction ();
|
||
if (ln.Intersection (pLine1,pt) == 0)//如果没有交点,平行;考虑精度和拉通
|
||
{
|
||
//只比较两对距离因为延长到边界函数中已经调整了起始终止点.
|
||
if ( ads_distance(ln.StartPoint() ,pLine1->StartPoint() )<precision &&
|
||
ads_distance(ln.EndPoint() ,pLine1->EndPoint() )<precision)
|
||
{
|
||
canAdd=FALSE;//有可能平行,也有可能不平行也不相交所以判断两个端点的距离
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (canAdd) //如果不重合,加入到链表;
|
||
{
|
||
lstLine.Append(new XLine(ln));
|
||
}
|
||
}
|
||
else //如果是圆弧:仅仅拉通它.不再要求到达边界
|
||
{
|
||
XArc ar=pWall->GetArc ();
|
||
TADSGePoint3d ptTemp = ar.GetCenterPt();
|
||
ptTemp.z = 0.0;
|
||
ar.SetCenterPt(ptTemp);
|
||
XPoint center,center1;
|
||
len1=lstArc.Length();
|
||
ar.Center(center);
|
||
BOOL canAdd=TRUE;
|
||
for (j=0;j<len1;j++)
|
||
{
|
||
XArc *pArc1=lstArc[j];
|
||
pArc1->Center(center1);
|
||
if (center == center1)
|
||
{// 如果是同一个圆心
|
||
if (fabs(ar.GetRadius()-pArc1->GetRadius())<precision/2)//如果半径相差在精度的一半以内,认为两段弧需要合并
|
||
{
|
||
if (ar.GetStarAngle() <pArc1->GetStarAngle() )//把起始和终止角度进行合并
|
||
{
|
||
pArc1->SetStarAngle(ar.GetStarAngle());
|
||
}
|
||
if (ar.GetEndAngle() >pArc1->GetEndAngle() )
|
||
{
|
||
pArc1->SetEndAngle(ar.GetEndAngle());
|
||
}
|
||
canAdd=FALSE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (canAdd) //如果不重合,加入到链表;
|
||
{
|
||
lstArc.Append(new XArc(ar));
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
len=lstArc.Length();
|
||
DList<XPoint> bakofcenter;
|
||
for (i=0;i<len;i++) //以下的处理是对于同一个圆心的圆弧轴网要求包含的弧度一致(整齐化)
|
||
{
|
||
XArc *pArc=NULL,*pArc1=NULL;
|
||
XPoint center,center1;
|
||
ads_real minStartAngle,maxEndAngle;
|
||
pArc=lstArc[i];
|
||
pArc->Center(center);
|
||
if (i == 0) //第一个:直接加入到使用过的圆心链表
|
||
{
|
||
bakofcenter.Append(new XPoint(center));
|
||
}
|
||
else //其余:检查是否已经使用过
|
||
{
|
||
BOOL isUsedCenter=FALSE;
|
||
len1=bakofcenter.Length();
|
||
for (j=0;j<len1;j++)
|
||
{
|
||
XPoint bak=*bakofcenter[j];
|
||
if (bak == center)
|
||
{
|
||
isUsedCenter=TRUE;
|
||
break;
|
||
}
|
||
}
|
||
if (isUsedCenter)//如果已经使用过,看下一个;
|
||
{
|
||
continue;
|
||
}
|
||
else//否则把这个没有用过的圆心加入到链表中
|
||
{
|
||
bakofcenter.Append(new XPoint(center));
|
||
}
|
||
}
|
||
minStartAngle=pArc->GetStarAngle();
|
||
maxEndAngle=pArc->GetEndAngle();
|
||
if (minStartAngle>maxEndAngle)//如果起始角大于终止角,看是否是要建立起始角大于终止角的弧形轴网
|
||
{
|
||
if (MessageBox(NULL,_T("\n发现起始角大于终止角的弧段.要建立起始角大于终止角的弧形轴网吗?"),_T("请您确定"),MB_YESNO) == IDYES)
|
||
{
|
||
for (j=i+1;j<len;j++)//此循环得到最大范围的起始终止角度
|
||
{
|
||
pArc1=lstArc[j];
|
||
pArc1->Center(center1);
|
||
if (center == center1)
|
||
{
|
||
if (minStartAngle>pArc1->GetStarAngle())
|
||
{
|
||
minStartAngle=pArc1->GetStarAngle();
|
||
}
|
||
if (maxEndAngle<pArc1->GetEndAngle())
|
||
{
|
||
maxEndAngle=pArc1->GetEndAngle();
|
||
}
|
||
}
|
||
}
|
||
minStartAngle-=anglespace;//减少/增加规定的弧度.都可调
|
||
maxEndAngle+=anglespace;//
|
||
for (j=i;j<len;j++)//此循环把最大范围的起始终止角度赋给各个同圆心的弧墙
|
||
{
|
||
pArc1=lstArc[j];
|
||
pArc1->Center(center1);
|
||
if (center == center1)
|
||
{
|
||
if (pArc1->GetStarAngle()<pArc1->GetEndAngle())
|
||
{
|
||
ads_printf(_T("\n存在起始角(约为%d度)小于终止角(约%d度)的弧段,系统不能对其拉通和齐整,忽略之..."),(int)(pArc1->GetStarAngle()*180/PI),(int)(pArc1->GetEndAngle()*180/PI));
|
||
pArc1->SetStarAngle(pArc1->GetStarAngle() - anglespace);
|
||
pArc1->SetEndAngle(pArc1->GetEndAngle() + anglespace);
|
||
}
|
||
else
|
||
{
|
||
pArc1->SetStarAngle(minStartAngle);
|
||
pArc1->SetEndAngle(maxEndAngle);
|
||
}
|
||
}
|
||
}
|
||
continue;
|
||
}
|
||
}
|
||
//建立起始角小于终止角的弧形轴网
|
||
for (j=i+1;j<len;j++)//此循环得到最大范围的起始终止角度
|
||
{
|
||
pArc1=lstArc[j];
|
||
pArc1->Center(center1);
|
||
if (center == center1)
|
||
{
|
||
if (minStartAngle>pArc1->GetStarAngle())
|
||
{
|
||
minStartAngle=pArc1->GetStarAngle();
|
||
}
|
||
if (maxEndAngle<pArc1->GetEndAngle())
|
||
{
|
||
maxEndAngle=pArc1->GetEndAngle();
|
||
}
|
||
}
|
||
}
|
||
minStartAngle-=anglespace;//减少/增加规定的弧度.都可调
|
||
maxEndAngle+=anglespace;//
|
||
for (j=i;j<len;j++)//此循环把最大范围的起始终止角度赋给各个同圆心的弧墙
|
||
{
|
||
pArc1=lstArc[j];
|
||
pArc1->Center(center1);
|
||
if (center == center1)
|
||
{
|
||
if (pArc1->GetStarAngle()>pArc1->GetEndAngle())
|
||
{
|
||
ads_printf(_T("\n存在起始角(约为%d度)大于终止角(约%d度)的弧段,系统不能对其拉通和齐整,忽略之..."),(int)(pArc1->GetStarAngle()*180/PI),(int)(pArc1->GetEndAngle()*180/PI));
|
||
pArc1->SetStarAngle(pArc1->GetStarAngle() - anglespace);
|
||
pArc1->SetEndAngle(pArc1->GetEndAngle() + anglespace);
|
||
}
|
||
else
|
||
{
|
||
pArc1->SetStarAngle(minStartAngle);
|
||
pArc1->SetEndAngle(maxEndAngle);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
DrawAxisNet(lstLine,lstArc,lstCircle);
|
||
}
|
||
|
||
extern TARCH_IMPEXP double g_dBaseDist;
|
||
|
||
void GetConfig(ads_real &space,ads_real &precision,ads_real &anglespace)
|
||
{
|
||
//modified by whl on 070202
|
||
//space=2000;
|
||
space=g_dBaseDist;
|
||
|
||
precision=100;
|
||
anglespace=0.1;
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:墙生轴网
|
||
void Wall2Axis()
|
||
{
|
||
InitLayer(LAY_AXIS, TRUE);
|
||
PickSet Set(SS_FREE), Set1(SS_FREE);
|
||
ads_real x,y,space=0,precision=0,anglespace=0;
|
||
XPoint cen,pt1,pt2,pt3,pt4;
|
||
DList<XLine> BoundLine;//边界线的集合
|
||
|
||
if (SelectEntities(_T("\n请选取要从中生成轴网的墙体:"), Set,
|
||
RBList(RTDXF0, _T("ATS_WALL,ATS_CURTAIN_WALL"), NULL))!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
//if (FilterWall(Set)==FALSE) return RTERROR;
|
||
GetConfig(space,precision,anglespace);
|
||
Set.GetExtend(cen,&x,&y);
|
||
x=x/2+space;//加上一个边距
|
||
y=y/2+space;//加上一个边距
|
||
pt1[X]=cen[X]+x;
|
||
pt1[Y]=cen[Y]+y;
|
||
pt2[X]=cen[X]+x;
|
||
pt2[Y]=cen[Y]-y;
|
||
BoundLine.Append (new XLine(pt1,pt2,LS_FINITE));//有限的线长度以及边界
|
||
pt3[X]=cen[X]-x;
|
||
pt3[Y]=cen[Y]-y;
|
||
BoundLine.Append (new XLine(pt2,pt3,LS_FINITE));
|
||
pt4[X]=cen[X]-x;
|
||
pt4[Y]=cen[Y]+y;
|
||
BoundLine.Append (new XLine(pt3,pt4,LS_FINITE));
|
||
BoundLine.Append (new XLine(pt4,pt1,LS_FINITE));
|
||
GenerateAxisNet(Set,BoundLine,precision,anglespace);
|
||
}
|
||
|
||
int EditAxisNet(AcDbObjectId id)
|
||
{
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbAxisLabelSet, pNet);
|
||
if (!pNet)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
|
||
if (pNet->upgradeOpen()!=Acad::eOk)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
pNet->SetShowHide(TRUE);
|
||
pNet->downgradeOpen();
|
||
|
||
while (1)
|
||
{
|
||
const TCHAR *szPrompt1=_T("\n选择 [变标注侧(M)/单轴变标注侧(S)/添补轴号(A)/删除轴号(D)/单轴变号(N)/重排轴号(R)/轴圈半径(Z)]<退出>:");
|
||
XString sKeyword;
|
||
int nRet=0;
|
||
INITGET_BEG(0, _T("S M A D R N Z"));
|
||
nRet=ads_getkword(szPrompt1, sKeyword);
|
||
INITGET_END();
|
||
|
||
if (nRet!=RTNORM)
|
||
{
|
||
break;
|
||
}
|
||
if (sKeyword[0] == _T('M'))
|
||
{
|
||
if (pNet->upgradeOpen()!=Acad::eOk)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
pNet->assertWriteEnabled();
|
||
int nVisSides=pNet->GetVisSides();
|
||
nVisSides ++;
|
||
if (nVisSides>3)
|
||
{
|
||
nVisSides=1;
|
||
}
|
||
pNet->SetVisSides(nVisSides);
|
||
pNet->downgradeOpen();
|
||
}
|
||
else if (sKeyword[0] == _T('S'))
|
||
{
|
||
XPoint ptPick;
|
||
while (ads_getpoint(NULL, _T("\n在需要改变标注侧的轴号附近取一点:"), ptPick) == RTNORM)
|
||
{
|
||
ptPick=Ucs2Wcs(ptPick);
|
||
//int nIdx=pNet->HitTestOnLabel(ptPick);modified by whl on 041117
|
||
int nIdx=pNet->HitTestOnLabel0(ptPick);//不忽略隐藏轴号
|
||
if (nIdx>=0)
|
||
{
|
||
int nVisSides=pNet->GetAxisVisSides(nIdx);
|
||
if (pNet->upgradeOpen()!=Acad::eOk)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
pNet->assertWriteEnabled();
|
||
nVisSides ++;
|
||
if (nVisSides>3)
|
||
{
|
||
nVisSides=0;
|
||
}
|
||
pNet->SetAxisVisSides(nIdx, nVisSides);
|
||
pNet->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
else if (sKeyword[0] == _T('D'))
|
||
{
|
||
XPoint ptPick;
|
||
if (XGetPoint(NULL, _T("\n在需要删除的轴号附近取一点"), ptPick) == RTNORM)
|
||
{
|
||
ptPick=Ucs2Wcs(ptPick);
|
||
int nAns=YesNoQuestion(_T("\n是否重排轴号"));
|
||
if (nAns!=RTCAN)
|
||
{
|
||
if (pNet->upgradeOpen()!=Acad::eOk)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
int idx=pNet->HitTestOnAxis(ptPick);
|
||
if (idx>=0)
|
||
{
|
||
pNet->RemoveLabel(idx, nAns==Q_YES);
|
||
}
|
||
pNet->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
else if (sKeyword[0] == _T('A'))
|
||
{
|
||
XPoint ptAdd;
|
||
if (XGetPoint(NULL, _T("\n请点取新轴号的位置"), ptAdd) == RTNORM)
|
||
{
|
||
ptAdd = Ucs2Wcs(ptAdd);
|
||
TCHAR szLab[64]=_T("");
|
||
const TCHAR *pszLab=NULL;
|
||
if (!pNet->IsSortAuto())
|
||
{
|
||
if (ads_getstring(0, _T("\n新增轴号<空号>:"), szLab) == RTCAN)
|
||
{
|
||
continue;
|
||
}
|
||
pszLab=szLab;
|
||
}
|
||
|
||
int nAns=YesNoQuestion(_T("\n新增轴号是否双侧标注"));
|
||
if (nAns == RTCAN)
|
||
{
|
||
continue;
|
||
}
|
||
int nAxisFlag=0;
|
||
if (nAns == Q_NO)
|
||
{
|
||
nAxisFlag = (pNet->OnWhichSide(ptAdd) == 0)? AXF_NOSIDE2 : AXF_NOSIDE1;
|
||
}
|
||
|
||
if (!pszLab)
|
||
{
|
||
int nAns1=YesNoQuestion(_T("\n新增轴号是否为附加轴号"), Q_NO);
|
||
if (nAns1 == RTCAN)
|
||
{
|
||
continue;
|
||
}
|
||
if (nAns1 == Q_YES)
|
||
{
|
||
nAxisFlag |= AXF_ATTACH;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (_tcschr(pszLab, _T('/')))
|
||
{
|
||
nAxisFlag |= AXF_ATTACH;
|
||
}
|
||
}
|
||
if (pNet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pNet->AddLabel(ptAdd, nAxisFlag, pszLab);
|
||
pNet->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
else if (sKeyword[0] == _T('N') || sKeyword[0] == _T('R'))
|
||
{
|
||
XPoint ptPick;
|
||
if (ads_getpoint(NULL, _T("\n请在要更改的轴号附近取一点:"), ptPick) == RTNORM)
|
||
{
|
||
ptPick=Ucs2Wcs(ptPick);
|
||
int nIdx=pNet->HitTestOnLabel(ptPick);
|
||
if (nIdx>=0)
|
||
{
|
||
const TCHAR *pszOld=pNet->GetLabel(nIdx);
|
||
TCHAR szOld[80]=_T("");
|
||
_tcscpy(szOld, pszOld);
|
||
adsout << _T("\n请输入新的轴号(.空号)<") << szOld << _T(">: ");
|
||
if (ads_getstring(0, _T(""), szOld) == RTNORM)
|
||
{
|
||
if (_tcscmp(szOld, _T(".")) == 0)
|
||
{
|
||
_tcscpy(szOld, _T(""));
|
||
}
|
||
else if (!szOld[0])
|
||
{
|
||
_tcscpy(szOld, pszOld);
|
||
}
|
||
if (pNet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pNet->SetLabel(nIdx, szOld, sKeyword[0]==_T('R'));
|
||
pNet->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (sKeyword[0] == _T('Z'))
|
||
{
|
||
double nRad=pNet->GetCirRadius();
|
||
if (GetReal(_T("\n轴圈在纸面上的半径"), nRad, RSG_NONEG|RSG_NOZERO) == RTNORM)
|
||
{
|
||
if (pNet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pNet->SetCirRadius(nRad);
|
||
pNet->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (pNet->upgradeOpen()!=Acad::eOk)
|
||
{
|
||
return RTERROR;
|
||
}
|
||
pNet->SetShowHide(FALSE);
|
||
|
||
OPENOBJ_END();
|
||
return RTNORM;
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:添补轴号
|
||
void AddAxisLabel()
|
||
{
|
||
// sg add 100521,进入命令后,临时显示全部隐藏轴号
|
||
SetShowHiddenAxisLable(true);
|
||
|
||
Entity ent;
|
||
XPoint ptPick;
|
||
RBList mask(RTDXF0, _T("ATS_AXIS_LABEL"), NULL);
|
||
if (SelectEntity(_T("\n请选择轴号对象<退出>: "), ent, ptPick, mask) != RTNORM)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
ptPick = Ucs2Wcs(ptPick);
|
||
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbAxisLabelSet, pSet);
|
||
if (!pSet)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
int idx = pSet->HitTestOnAxis(ptPick);
|
||
if (idx < 0)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
pSet->close();
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
XCurveSegment segRef = pSet->GetAxis(idx);
|
||
XPoint ptNear = segRef.NearPoint(ptPick);
|
||
XPoint ptAdd;
|
||
if (XGetPoint(Wcs2Ucs(ptNear), _T("\n请点取新轴号的位置"), ptAdd)!=RTNORM)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
pSet->close();
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
ptAdd = Ucs2Wcs(ptAdd);
|
||
|
||
TCHAR szLab[64] = _T("");
|
||
const TCHAR *pszLab = NULL;
|
||
if (!pSet->IsSortAuto())
|
||
{
|
||
if (ads_getstring(0, _T("\n新增轴号<空号>:"), szLab) == RTCAN)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
pSet->close();
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
pszLab = szLab;
|
||
}
|
||
|
||
int nAns = YesNoQuestion(_T("\n新增轴号是否双侧标注"));
|
||
if (nAns == RTCAN)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
pSet->close();
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
int nAxisFlag = 0;
|
||
if (nAns == Q_NO)
|
||
{
|
||
nAxisFlag = (pSet->OnWhichSide(ptAdd) == 0) ? AXF_NOSIDE2 : AXF_NOSIDE1;
|
||
}
|
||
|
||
if (!pszLab)
|
||
{
|
||
int nAns1 = YesNoQuestion(_T("\n新增轴号是否为附加轴号"), Q_NO);
|
||
if (nAns1 == RTCAN)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
pSet->close();
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
if (nAns1 == Q_YES)
|
||
{
|
||
nAxisFlag |= AXF_ATTACH;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (_tcschr(pszLab, _T('/')))
|
||
{
|
||
nAxisFlag |= AXF_ATTACH;
|
||
}
|
||
}
|
||
|
||
//add by lgy 20120208 添加提示是否需要重排号
|
||
int iAns = YesNoQuestion(_T("\n是否重排轴号"), Q_YES);
|
||
if (iAns == RTCAN)
|
||
{
|
||
SetShowHiddenAxisLable(false);
|
||
pSet->close();
|
||
return;
|
||
}
|
||
bool bSortLabel = (iAns==Q_YES);
|
||
if (pSet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
//modify by lgy 20120208 增加是否需要重排号
|
||
//pSet->AddLabel(ptAdd, nAxisFlag, pszLab);
|
||
pSet->AddLabel(ptAdd, nAxisFlag, pszLab, bSortLabel);
|
||
pSet->downgradeOpen();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// Command: 添加轴号
|
||
//void DelAxisLabel()
|
||
//{
|
||
// Entity ent;
|
||
// XPoint ptPick;
|
||
// if (SelectEntity(_T("\n请选择轴号对象<退出>: "), ent, ptPick, RBList(RTDXF0, _T("ATS_AXIS_LABEL"),NULL))!=RTNORM)
|
||
// return;
|
||
// int nAns=YesNoQuestion(_T("\n是否重排轴号"), Q_YES);
|
||
// if (nAns==RTCAN)
|
||
// return;
|
||
// BOOL bSortLabel=(nAns==Q_YES);
|
||
// ptPick=Ucs2Wcs(ptPick);
|
||
// OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
// if (!pSet)
|
||
// return;
|
||
// int idx=pSet->HitTestOnAxis(ptPick);
|
||
// if (idx<0)
|
||
// return;
|
||
// pSet->RemoveLabel(idx, bSortLabel);
|
||
// OPENOBJ_END();
|
||
//}
|
||
|
||
// Modify By LCF 2004/07/08
|
||
// 需要删除轴号的轴标实体
|
||
class TAxisLabelSet
|
||
{
|
||
public:
|
||
DualList<long> m_lstIndex; // 所有将要删除的轴号的索引
|
||
AcDbObjectId m_iId; // 轴号实体
|
||
TDbAxisLabelSet *pEnt;
|
||
|
||
public:
|
||
bool AppendIndexDel(int i)
|
||
{
|
||
long oldLen=m_lstIndex.GetLength();
|
||
m_lstIndex.FindOrAddTail(i);
|
||
return oldLen<m_lstIndex.GetLength();
|
||
}
|
||
|
||
//ok,如果已经存在不添加
|
||
void RemoveLabel(bool bSort)
|
||
{
|
||
m_lstIndex.Arrange(false);
|
||
|
||
// modify by xly on 110306 修改删除附加轴号是首根轴号的错误
|
||
/*acdbOpenObject(pEnt,m_iId,AcDb::kForWrite);
|
||
for (m_lstIndex.MoveToFirst();!m_lstIndex.IsOut();m_lstIndex.MoveToNext())
|
||
{
|
||
pEnt->RemoveLabel(m_lstIndex.GetCurData(),bSort);
|
||
}
|
||
pEnt->close();*/
|
||
if (Acad::eOk==acdbOpenObject(pEnt,m_iId,AcDb::kForWrite))
|
||
{
|
||
for (m_lstIndex.MoveToFirst();!m_lstIndex.IsOut();m_lstIndex.MoveToNext())
|
||
{
|
||
pEnt->RemoveLabel(m_lstIndex.GetCurData(),bSort);
|
||
if (bSort)// 删除重排后主轴号之前的错误部分处理
|
||
{
|
||
int nPosMajar(-1);
|
||
int i=0;
|
||
for (i=0;i<pEnt->GetAxisNum(); i++)
|
||
{
|
||
CString csLable = pEnt->GetLabel(i);
|
||
int iIndex = csLable.Find(_T("/"));
|
||
if (iIndex<0)
|
||
{
|
||
nPosMajar = i;
|
||
break;
|
||
}
|
||
}
|
||
if (nPosMajar>0)
|
||
{
|
||
int nTemp = nPosMajar;
|
||
CString csLable = pEnt->GetLabel(nPosMajar);
|
||
bool bFenQu = (csLable.Find(_T("-"))>-1);
|
||
if (bFenQu)// 主轴号是分区轴号
|
||
{
|
||
csLable.Insert((csLable.Find(_T("-"))+1),_T('0'));
|
||
}
|
||
for (i=0; i<nPosMajar;i++)
|
||
{
|
||
CString csFir = _T("");
|
||
if (bFenQu)// 主轴号是分区轴号
|
||
{
|
||
csFir.Format(_T("%d/"),nTemp);
|
||
}
|
||
else
|
||
{
|
||
csFir.Format(_T("%d/0"),nTemp);
|
||
}
|
||
|
||
csFir += csLable;
|
||
pEnt->SetLabel(i,csFir,FALSE);
|
||
nTemp--;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
pEnt->close();
|
||
}
|
||
|
||
}
|
||
|
||
bool operator ==(const TAxisLabelSet&aSet){return m_iId==aSet.m_iId;}//ok
|
||
bool operator >(const TAxisLabelSet&){return false;}
|
||
bool operator <(const TAxisLabelSet&){return false;}
|
||
};
|
||
|
||
// 需要删除轴号的所有轴标实体
|
||
class TAllAxis:public PDList<TAxisLabelSet>
|
||
{
|
||
public:
|
||
long Find(AcDbObjectId id)//搜索id对应的轴标项,返回其索引,如果不存在则先建立一个id代表的新项。
|
||
{
|
||
for (MoveToFirst();!IsOut();MoveToNext())
|
||
{
|
||
if (GetCurData()->m_iId == id)//找到
|
||
{
|
||
return GetCur();
|
||
}
|
||
}
|
||
TAxisLabelSet *pAxis=new TAxisLabelSet;
|
||
pAxis->m_iId=id;
|
||
AddTail(pAxis);//没有找到就添加
|
||
|
||
return GetLastIndex();
|
||
}
|
||
|
||
void RemoveLabel(bool bSort)
|
||
{
|
||
for (MoveToFirst();!IsOut();MoveToNext())
|
||
{
|
||
GetCurData()->RemoveLabel(bSort);
|
||
}
|
||
}
|
||
};
|
||
|
||
// [2010-4-20 wubo] 根据两个角点得到一个poly。从DelAxisLabel()中提取函数。
|
||
TGGePoly2D GetExtentPolyByTwoCorner(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptEnd )
|
||
{
|
||
TADSGePoint3d ptLowLeft, ptLowRight, ptUpRight, ptUpLeft;
|
||
if (ptStart.x > ptEnd.x)
|
||
{
|
||
ptLowLeft.x = ptEnd.x;
|
||
ptUpLeft.x = ptEnd.x;
|
||
ptLowRight.x = ptStart.x;
|
||
ptUpRight.x = ptStart.x;
|
||
}
|
||
else
|
||
{
|
||
ptLowLeft.x = ptStart.x;
|
||
ptUpLeft.x = ptStart.x;
|
||
ptLowRight.x = ptEnd.x;
|
||
ptUpRight.x = ptEnd.x;
|
||
}
|
||
|
||
if (ptStart.y > ptEnd.y)
|
||
{
|
||
ptLowLeft.y = ptEnd.y;
|
||
ptLowRight.y = ptEnd.y;
|
||
ptUpLeft.y = ptStart.y;
|
||
ptUpRight.y = ptStart.y;
|
||
}
|
||
else
|
||
{
|
||
ptLowLeft.y = ptStart.y;
|
||
ptLowRight.y = ptStart.y;
|
||
ptUpLeft.y = ptEnd.y;
|
||
ptUpRight.y = ptEnd.y;
|
||
}
|
||
|
||
TGGePoly2D poly(1);
|
||
poly.AppendNode(ptLowLeft);
|
||
poly.AppendNode(ptLowRight);
|
||
poly.AppendNode(ptUpRight);
|
||
poly.AppendNode(ptUpLeft);
|
||
return poly;
|
||
}
|
||
|
||
// add by xly on 110306 将选择集中的轴号虚显
|
||
void SetVisulShow(PickSet ssMouseSel, TGGePoly2D extentPoly, PickSet& ssLabel)
|
||
{
|
||
long l = 0,
|
||
lSelLength = ssMouseSel.Length(); // 选择集的长度
|
||
|
||
for (l = 0; l<lSelLength; l++)
|
||
{
|
||
Entity ent = ssMouseSel[l];
|
||
// modify by xly on 110503 以安全的方式打开
|
||
//OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbAxisLabelSet, pSet);
|
||
if (pSet == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 克隆实体
|
||
TDbAxisLabelSet *pNewAxis = (TDbAxisLabelSet *)pSet->clone();
|
||
|
||
int nSide = pNewAxis->GetVisSides(),
|
||
nTmpIndex = 0;
|
||
|
||
// 对框选中的轴圈操作时,遍历实体,寻找框选到的轴号
|
||
int iNum = 0,
|
||
iAxisNumLength = pNewAxis->GetAxisNum();
|
||
AcDbIntArray aryAxisInSel;
|
||
|
||
if (nSide == 1 || nSide == 3) // 只标第0侧,或双侧标注
|
||
{
|
||
TADSGePoint3d ptLabelCenter;
|
||
for (iNum = 0; iNum < iAxisNumLength; iNum++)
|
||
{
|
||
ptLabelCenter = pNewAxis->GetLabelCenter(iNum, 0);
|
||
if ((ptLabelCenter&extentPoly) != PR_OUTSIDE) // 在框选范围外
|
||
{
|
||
if (!aryAxisInSel.find(iNum, nTmpIndex)) // 找不到就添加
|
||
{
|
||
aryAxisInSel.append(iNum);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (nSide == 2 || nSide == 3) // 只标第1侧,或双侧标注
|
||
{
|
||
TADSGePoint3d ptLabelCenter;
|
||
for (iNum = 0; iNum < iAxisNumLength; iNum++)
|
||
{
|
||
ptLabelCenter = pNewAxis->GetLabelCenter(iNum, 1);
|
||
if ((ptLabelCenter&extentPoly) != PR_OUTSIDE) // 在框选范围内
|
||
{
|
||
if (!aryAxisInSel.find(iNum, nTmpIndex)) // 找不到就添加
|
||
{
|
||
aryAxisInSel.append(iNum);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int nTemp = 0;
|
||
for (iNum = 0; iNum < iAxisNumLength; iNum++)
|
||
{
|
||
if (!aryAxisInSel.find(nTemp, nTmpIndex)) // 找不到,表示被选中,不删除
|
||
{
|
||
pNewAxis->RemoveLabel(iNum, FALSE);
|
||
iAxisNumLength--;
|
||
iNum--;
|
||
}
|
||
nTemp++;
|
||
}
|
||
ssLabel += pNewAxis->AddToMSpace(Adesk::kFalse);
|
||
// modify by xly on 110503 以安全的方式打开,增加一个成功的判断
|
||
if (pNewAxis->downgradeOpen()==Acad::eOk)
|
||
{
|
||
pNewAxis->highlight();
|
||
}
|
||
pNewAxis->close();
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:删除轴号
|
||
void DelAxisLabel()
|
||
{
|
||
// sg add 100521,进入命令后,临时显示全部隐藏轴号
|
||
SetShowHiddenAxisLable(true);
|
||
|
||
XPushVar<int> osmode(_T("OSMODE"), 0);
|
||
|
||
TAllAxis allEnt; // 所有相关轴标实体
|
||
|
||
// modify by xly on 110306 保存框选到的的轴号
|
||
//PickSet ssLabel(SS_FREE);
|
||
PickSet ssLabel(SS_CREATE);
|
||
while (1)
|
||
{
|
||
XPoint ptStart, ptEnd;
|
||
Entity ent;
|
||
int ret = acedGetPoint(NULL, _T("\n请框选轴号对象<退出>:"), ptStart);
|
||
if (ret == RTCAN)
|
||
{
|
||
ssLabel.Erase();
|
||
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
if (ret != RTNORM)
|
||
{
|
||
break;
|
||
}
|
||
|
||
if (XGetCorner(ptStart, NULL, ptEnd) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// [2010-4-20 wubo] 提取了公共函数GetExtentPolyByTwoCorner
|
||
//XPoint ptLowLeft, ptLowRight, ptUpRight, ptUpLeft;
|
||
//if (ptStart.x > ptEnd.x)
|
||
//{
|
||
// ptLowLeft.x = ptEnd.x;
|
||
// ptUpLeft.x = ptEnd.x;
|
||
// ptLowRight.x = ptStart.x;
|
||
// ptUpRight.x = ptStart.x;
|
||
//}
|
||
//else
|
||
//{
|
||
// ptLowLeft.x = ptStart.x;
|
||
// ptUpLeft.x = ptStart.x;
|
||
// ptLowRight.x = ptEnd.x;
|
||
// ptUpRight.x = ptEnd.x;
|
||
//}
|
||
//if (ptStart.y > ptEnd.y)
|
||
//{
|
||
// ptLowLeft.y = ptEnd.y;
|
||
// ptLowRight.y = ptEnd.y;
|
||
// ptUpLeft.y = ptStart.y;
|
||
// ptUpRight.y = ptStart.y;
|
||
//}
|
||
//else
|
||
//{
|
||
// ptLowLeft.y = ptStart.y;
|
||
// ptLowRight.y = ptStart.y;
|
||
// ptUpLeft.y = ptEnd.y;
|
||
// ptUpRight.y = ptEnd.y;
|
||
//}
|
||
//
|
||
//XPoly2D poly(1);
|
||
//poly.AppendNode(ptLowLeft);
|
||
//poly.AppendNode(ptLowRight);
|
||
//poly.AppendNode(ptUpRight);
|
||
//poly.AppendNode(ptUpLeft);
|
||
|
||
XPoly2D poly = GetExtentPolyByTwoCorner(ptStart, ptEnd);
|
||
|
||
RBList rbRegion = poly.Polygon();
|
||
PickSet ss(SS_FREE);
|
||
if (ss.Get(_T("CP"), rbRegion, NULL, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
poly.TransUCS(Groups(1), Groups(0));
|
||
|
||
long num = ss.Length();
|
||
for (long i=0; i<num; i++)
|
||
{
|
||
Entity ent = ss[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
if (pSet == NULL) // add by lcf on 050224
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// add by xly on 100810 解决删除轴号时,不能删除隐藏轴号
|
||
// 判断框选的范围内是否有隐藏轴号
|
||
for(int k = 0; k<pSet->GetAxisNum();k++)
|
||
{
|
||
// 获得标注的信息
|
||
XCurveSegment seg = pSet->GetAxis(k);
|
||
|
||
// 判断在框选的范围内标注是否有隐藏
|
||
XPoint ptCentre = pSet->GetLabelCenter(k,0);
|
||
int iIsIn = ptCentre & poly;
|
||
if (iIsIn != PR_OUTSIDE) // 0侧
|
||
{
|
||
pSet->HideAxisLabel(k,0,FALSE);
|
||
}
|
||
|
||
ptCentre = pSet->GetLabelCenter(k,1);
|
||
iIsIn = ptCentre & poly;
|
||
if (iIsIn != PR_OUTSIDE)// 1侧
|
||
{
|
||
pSet->HideAxisLabel(k,1,FALSE);
|
||
}
|
||
}
|
||
|
||
AcDbObjectId eId = pSet->objectId();
|
||
allEnt.Find(eId);
|
||
|
||
TAxisLabelSet *pLabelSet = allEnt.GetCurData();
|
||
AcDbVoidPtrArray entSet;
|
||
pSet->Explode(entSet);
|
||
|
||
long nLen = entSet.length();
|
||
for (long index=nLen-1; index>=0; index--)
|
||
{
|
||
AcDbEntity *pEnt = (AcDbEntity*)entSet[index];
|
||
if (!pEnt->isKindOf(TDbSymbDrawingIndex::desc()))
|
||
{
|
||
delete pEnt;
|
||
entSet.removeAt(index);
|
||
}
|
||
}
|
||
|
||
for (long j=0; j<entSet.length(); j++)
|
||
{
|
||
TDbSymbDrawingIndex *pIndex = (TDbSymbDrawingIndex*)entSet[j];
|
||
XPoint ptCen = pIndex->GetCenter();
|
||
int rtInSide = ptCen & poly;
|
||
if (rtInSide != PR_OUTSIDE)
|
||
{
|
||
//modified by whl on 060107
|
||
//int idx = pSet->HitTestOnAxis(ptCen);
|
||
int idx = pSet->HitTestOnLabel(ptCen);
|
||
|
||
if (idx >= 0 && pLabelSet->AppendIndexDel(idx))
|
||
{
|
||
int iSide = pSet->GetAxisVisSides(idx);
|
||
if (iSide == 3)
|
||
{
|
||
XPoint ptStaCen, ptEndCen;
|
||
ptStaCen = pSet->GetLabelCenter(idx, 0);
|
||
ptEndCen = pSet->GetLabelCenter(idx, 1);
|
||
|
||
for (long k=0; k<entSet.length(); k++)
|
||
{
|
||
TDbSymbDrawingIndex *pSideIndex = (TDbSymbDrawingIndex*)entSet[k];
|
||
XPoint ptSideCen = pSideIndex->GetCenter();
|
||
double dSta = ptSideCen.Distance2d(ptStaCen);
|
||
double dEnd = ptSideCen.Distance2d(ptEndCen);
|
||
if (dSta < 1.0E-6 || dEnd < 1.0E-6)
|
||
{
|
||
// delete by xly on 110306 设置框选的轴号的虚显不用此函数
|
||
/*TDbSymbDrawingIndex *pHightlight = (TDbSymbDrawingIndex*)pSideIndex->clone();
|
||
ssLabel += pHightlight->AddToMSpace(Adesk::kFalse);
|
||
pHightlight->downgradeOpen();
|
||
pHightlight->highlight();
|
||
pHightlight->close();*/
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// delete by xly on 110306 设置框选的轴号的虚显不用此函数
|
||
/*TDbSymbDrawingIndex *pHightlight = (TDbSymbDrawingIndex*)pIndex->clone();
|
||
ssLabel+=pHightlight->AddToMSpace(Adesk::kFalse);
|
||
pHightlight->downgradeOpen();
|
||
pHightlight->highlight();
|
||
pHightlight->close();*/
|
||
}
|
||
}
|
||
}
|
||
}
|
||
ReleaseEntSet(entSet);
|
||
OPENOBJ_END();
|
||
}
|
||
// add by xly on 110306 设置轴号的虚显
|
||
PickSet ssTemp(SS_CREATE);
|
||
ssTemp += ss;
|
||
SetVisulShow(ssTemp, poly, ssLabel);
|
||
ssTemp.Free();
|
||
continue;
|
||
}
|
||
|
||
long nlight = ssLabel.Length();
|
||
if (nlight <= 0)
|
||
{
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
int nAns = YesNoQuestion(_T("\n是否重排轴号"), Q_YES);
|
||
// modify by xly on 110503 重复框选同一个轴标出现错误,提到下面调用
|
||
//ssLabel.Erase();
|
||
if (nAns == RTCAN)
|
||
{
|
||
// add by xly on 110503 取消时清除轴号
|
||
ssLabel.Erase();
|
||
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
return;
|
||
}
|
||
|
||
bool bSortLabel = (nAns==Q_YES);
|
||
allEnt.RemoveLabel(bSortLabel);
|
||
|
||
ssLabel.Erase();
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// sg add 100530,判断是否需要在“重排轴号”命令中,提示用户选择“变前项”、“变后项”
|
||
bool IsPromptChangeNoRule(const TCHAR *pszText)
|
||
{
|
||
int nLength = (int)_tcslen(pszText);
|
||
if (nLength < 2) // 单个字母或者为空,不需要提示选择排序原则
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if (IsDigital(pszText)) // 全部是数字,也不需要提示选择排序原则
|
||
{
|
||
return false;
|
||
}
|
||
|
||
const TCHAR *pSep = _tcschr(pszText, _T('/'));
|
||
if (pSep != NULL) // 附加轴号,也不需要提示选择排序原则
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true; // 字母数字组合
|
||
}
|
||
|
||
// 命令: 重排轴号
|
||
void ChAxisLabel1()
|
||
{
|
||
XPoint ptPick;
|
||
Entity entAxisNo;
|
||
RBList mask(RTDXF0, _T("ATS_AXIS_LABEL"), NULL);
|
||
if (SelectEntity(_T("\n请选择需重排的第一根轴号<退出>: "), entAxisNo, ptPick, mask) == RTNORM)
|
||
{
|
||
ptPick = Ucs2Wcs(ptPick); // Add on 2001/11/29 by ZJQ
|
||
|
||
OPENOBJ_BEGIN(entAxisNo, AcDb::kForRead, TDbAxisLabelSet, pLabel);
|
||
int nIdx = pLabel->HitTestOnLabel(ptPick);
|
||
if (nIdx >= 0)
|
||
{
|
||
const TCHAR *pszOld = pLabel->GetLabel(nIdx);
|
||
|
||
TCHAR szOld[80] = _T("");
|
||
_tcscpy(szOld, pszOld);
|
||
adsout << _T("\n请输入新的轴号(.空号)<") << szOld << _T(">: ");
|
||
|
||
if (ads_getstring(0, _T(""), szOld) == RTNORM)
|
||
{
|
||
if (_tcscmp(szOld, _T(".")) == 0)
|
||
{
|
||
_tcscpy(szOld, _T(""));
|
||
}
|
||
else if (!szOld[0])
|
||
{
|
||
_tcscpy(szOld, pszOld);
|
||
}
|
||
|
||
// sg add 100530,根据8.5的需求,增加了“变前项”、“变后项”的设置
|
||
// 需要给出提示“请输入轴号规则”的提示
|
||
bool bPrompt = ::IsPromptChangeNoRule(szOld);
|
||
|
||
BOOL bChangePreNo = pLabel->IsChangePreNum(); // 当前规则
|
||
if (bPrompt)
|
||
{
|
||
TCHAR szSortRule[10] = _T("");
|
||
if (bChangePreNo) // 变前项
|
||
{
|
||
_tcscpy(szSortRule, _T("F"));
|
||
}
|
||
else // 变后项
|
||
{
|
||
_tcscpy(szSortRule, _T("B"));
|
||
}
|
||
adsout << _T("\n请输入轴号规则[变后项(B)/变前项(F)]<") << szSortRule << _T(">: ");
|
||
|
||
int nRet = ads_getstring(0, _T(""), szSortRule);
|
||
if (nRet == RTNORM)
|
||
{
|
||
if (szSortRule[0])
|
||
{
|
||
bChangePreNo = _tcscmp(szSortRule, _T("F"))==0 || _tcscmp(szSortRule, _T("f"))==0;
|
||
}
|
||
}
|
||
else // 其他
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (pLabel->upgradeOpen() == Acad::eOk)
|
||
{
|
||
// sg add 100530,将用户设置的“变前项”、“变后项”的值,传递给对象
|
||
if (bPrompt)
|
||
{
|
||
pLabel->SetChangePreNum(bChangePreNo);
|
||
}
|
||
|
||
pLabel->SetLabel(nIdx, szOld, TRUE);
|
||
pLabel->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:修改轴号
|
||
void ChAxisLabel2()
|
||
{
|
||
XPoint ptPick;
|
||
Entity entAxisNo;
|
||
RBList mask(RTDXF0, _T("ATS_AXIS_LABEL"), NULL);
|
||
while (SelectEntity(_T("\n请选择轴号<退出>: "), entAxisNo, ptPick, mask) == RTNORM)
|
||
{
|
||
ptPick = Ucs2Wcs(ptPick); // Add on 2001/11/29 by ZJQ
|
||
|
||
OPENOBJ_BEGIN(entAxisNo, AcDb::kForRead, TDbAxisLabelSet, pLabel);
|
||
int nIdx = pLabel->HitTestOnLabel(ptPick);
|
||
if (nIdx >= 0)
|
||
{
|
||
const TCHAR *pszOld = pLabel->GetLabel(nIdx);
|
||
TCHAR szOld[80] = _T("");
|
||
_tcscpy(szOld, pszOld);
|
||
adsout << _T("\n请输入新的轴号(.空号)<") << szOld << _T(">: ");
|
||
|
||
if (ads_getstring(0, _T(""), szOld) == RTNORM)
|
||
{
|
||
if (_tcscmp(szOld, _T(".")) == 0)
|
||
{
|
||
_tcscpy(szOld, _T(""));
|
||
}
|
||
else if (!szOld[0])
|
||
{
|
||
_tcscpy(szOld, pszOld);
|
||
}
|
||
|
||
if (pLabel->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pLabel->SetLabel(nIdx, szOld, FALSE);
|
||
pLabel->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////
|
||
// 必须在WCS下
|
||
// modify by xly 1005010,完成8.5的新需求,整体修该命令
|
||
/*
|
||
void ManualDimAxis()
|
||
{
|
||
InitLayer(LAY_DIMAX, TRUE);
|
||
RBList mask(RTDXF0, _T("LINE,ARC"), 8, LAY_AXIS, NULL);
|
||
XPoint ptPick;
|
||
while (1) {
|
||
Entity entFirstAxis;
|
||
{
|
||
XPushVar<int> osmode(_T("OSMODE"), OS_END|OS_NEA);
|
||
if (SelectEntity1(_T("\n点取待标注的轴线<退出>:"), entFirstAxis, ptPick, mask)!=RTNORM)
|
||
return;
|
||
ptPick=Ucs2Wcs(ptPick); // Add on 2001/11/29 by ZJQ
|
||
}
|
||
XCurveSegment curve(entFirstAxis);
|
||
BOOL bOnStart=ptPick.Distance2d(curve.StartPoint())<ptPick.Distance2d(curve.EndPoint());
|
||
XPoint ptAxisEnd = curve.NearPoint(ptPick);
|
||
XPoint ptAxisEnd1;
|
||
double nAxisDirection=curve.IDirection(bOnStart? 0: 1);
|
||
ads_polar(ptAxisEnd, nAxisDirection, curve.GetLength(), ptAxisEnd1);
|
||
|
||
TCHAR szLabel[256]=_T("");
|
||
if (ads_getstring(0, _T("\n请输入轴号<空号>:"), szLabel)==RTCAN)
|
||
return;
|
||
|
||
TDbAxisLabelSet *pAxisDim=new TDbAxisLabelSet;
|
||
pAxisDim->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pAxisDim->SetTextLayerId(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pAxisDim->AddAxis(XCurveSegment(ptAxisEnd, ptAxisEnd1, 0.0, LS_FINITE), FALSE, szLabel);
|
||
ASSERT(pAxisDim->IsValid());
|
||
pAxisDim->SetSortAuto(FALSE);
|
||
pAxisDim->HideSide(1);
|
||
pAxisDim->SetLayoutRotation(Ucs2Wcs(0));
|
||
pAxisDim->AddToMSpace(Adesk::kTrue);
|
||
}
|
||
}
|
||
*/
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:逐点标注(逐点轴标)
|
||
void ManualDimAxis()
|
||
{
|
||
// 初始化图层
|
||
InitLayer(LAY_DIMAX, TRUE);
|
||
|
||
// 初始化对话框
|
||
CManualDimAxisDlg dlg(acedGetAcadFrame());
|
||
{
|
||
CAcModuleResourceOverride vTemp;
|
||
if (!dlg.Create(CManualDimAxisDlg::IDD, acedGetAcadFrame()))
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
dlg.ShowWindow(SW_SHOW);
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
XPoint ptPick;
|
||
Entity entFirstAxis;
|
||
CString csLabel = _T("");
|
||
RBList mask(RTDXF0, _T("LINE,ARC"), 8, LAY_AXIS, NULL);
|
||
|
||
// 当前UCS
|
||
double dUcsAngle = Ucs2Wcs(0.0);
|
||
AcGeVector3d vtCurXAxis(cos(dUcsAngle), sin(dUcsAngle), 0); // 当前坐标系下的X轴
|
||
|
||
while (1)
|
||
{
|
||
{
|
||
XPushVar<int> osmode(_T("OSMODE"), OS_END|OS_NEA);
|
||
if (SelectEntity1(_T("\n点取待标注的轴线<退出>:"), entFirstAxis, ptPick, mask) != RTNORM)
|
||
{
|
||
// add by xly on 101029 释放对话框资源,解决运行命令后CAD中的打开、新建、图纸切换不可用
|
||
if (IsWindow(dlg.m_hWnd))
|
||
{
|
||
dlg.DestroyWindow();
|
||
}
|
||
return;
|
||
}
|
||
|
||
ptPick = Ucs2Wcs(ptPick);
|
||
}
|
||
|
||
XCurveSegment curve(entFirstAxis);
|
||
bool bOnStart = ptPick.Distance2d(curve.StartPoint())<ptPick.Distance2d(curve.EndPoint());
|
||
|
||
// 获取轴线中,离拾取点较近的一侧
|
||
XPoint ptAxisNear = curve.NearPoint(ptPick),
|
||
ptAxisFar;
|
||
double nAxisDirection = curve.IDirection(bOnStart ? 0 : 1);
|
||
ads_polar(ptAxisNear, nAxisDirection, curve.GetLength(), ptAxisFar);
|
||
|
||
// 对话框的选择项目
|
||
int iSelected = dlg.m_iWhichSlected;
|
||
int iTxtOrGraph = dlg.m_iTxtorGrap;
|
||
BOOL bIsContinue = dlg.m_bButCon;
|
||
|
||
// 获得多轴,不连续图形的所有值
|
||
CStringArray aryAxisLable;
|
||
dlg.GetAllAxis(aryAxisLable);
|
||
|
||
// 获得起、止位置的内容
|
||
CString csStartAxis = _T(""),
|
||
csEnfAxis = _T("");
|
||
dlg.GetStartAndEndAxis(csStartAxis, csEnfAxis);
|
||
|
||
// 根据对话框的选项设置第一个轴圈内容
|
||
if (bIsContinue && iSelected == 1) // 多轴,连续
|
||
{
|
||
csLabel = csStartAxis;
|
||
}
|
||
else if (iTxtOrGraph == 1 && iSelected == 1) // 多轴,图形
|
||
{
|
||
csLabel = aryAxisLable.GetAt(0);
|
||
}
|
||
else // 单轴,多轴、文字
|
||
{
|
||
csLabel = dlg.GetFirstAxis();
|
||
}
|
||
|
||
// add by xly 100813 修改轴标引线长度的变量
|
||
// 设置轴标的引线长度
|
||
double dLeaderLen = dlg.GetLeaderLen();
|
||
dLeaderLen = dLeaderLen * DocGetPScale();
|
||
|
||
// 绘制第一个轴圈
|
||
TDbAxisLabelSet *pAxisDim = new TDbAxisLabelSet;
|
||
pAxisDim->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pAxisDim->SetTextLayerId(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pAxisDim->AddAxis(XCurveSegment(ptAxisNear, ptAxisFar, 0.0, LS_FINITE), 0, csLabel);
|
||
|
||
ASSERT(pAxisDim->IsValid());
|
||
pAxisDim->SetSortAuto(FALSE);
|
||
pAxisDim->HideSide(1);
|
||
pAxisDim->SetLayoutRotation(dUcsAngle);
|
||
|
||
// add by xly 100813 修改轴标引线长度的变量
|
||
pAxisDim->SetLeaderLen(0,dLeaderLen, FALSE);
|
||
|
||
pAxisDim->AddToMSpace(Adesk::kTrue);
|
||
|
||
if (iSelected == 0) // 单轴只有一个轴圈
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// modify by xly 100813 预留可以修改轴标引线长度的变量
|
||
// 引线默认长度
|
||
//pAxisDim->GetLeaderLen((pAxisDim->GetVisSides()), FALSE);
|
||
double dLenLeader = dLeaderLen;
|
||
|
||
// 图形类多轴号
|
||
if (!bIsContinue && iTxtOrGraph == 1)
|
||
{
|
||
AcGePoint3d ptPos, ptFar;
|
||
|
||
// 将获得的csArry数组的1到iLen-1个字符串做成轴标
|
||
int nLength = (int)aryAxisLable.GetSize();
|
||
for (int i = 1; i < nLength; i++)
|
||
{
|
||
// 获得引线长度
|
||
dLenLeader = dLenLeader + pAxisDim->GetCirRadius(FALSE) * 2;
|
||
ads_polar(ptAxisNear, nAxisDirection + PI, dLenLeader , asDblArray(ptPos));
|
||
ads_polar(ptAxisFar, nAxisDirection, dLenLeader , asDblArray(ptFar));
|
||
|
||
|
||
// 声明轴标对象,设置相关内容
|
||
TDbAxisLabelSet *pNewAxisDim = new TDbAxisLabelSet;
|
||
pNewAxisDim->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pNewAxisDim->SetTextLayerId(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pNewAxisDim->AddAxis(XCurveSegment(ptPos, ptFar, 0.0, LS_FINITE), 0, aryAxisLable.GetAt(i));
|
||
|
||
// 将新生成的多轴号,引线长度设置为0
|
||
pNewAxisDim->SetLeaderLen(0, 0.0, TRUE);
|
||
pNewAxisDim->SetLeaderLen(1, 0.0, TRUE);
|
||
ASSERT(pNewAxisDim->IsValid());
|
||
|
||
pNewAxisDim->SetSortAuto(FALSE);
|
||
pNewAxisDim->HideSide(1);
|
||
pNewAxisDim->SetLayoutRotation(dUcsAngle);
|
||
pNewAxisDim->AddToMSpace(Adesk::kTrue);
|
||
}
|
||
|
||
continue;
|
||
}
|
||
|
||
double dRadCir = pAxisDim->GetCirRadius(FALSE), // 轴圈半径
|
||
dTextHeight = AXISTEXT_HEIGHT * DocGetPScale(), // 默认字高
|
||
dAngleVet = 0.0;
|
||
dTextHeight = dRadCir*5.5/4;
|
||
|
||
CString csTextHeight;
|
||
csTextHeight.Format(_T("%.1f"), dTextHeight);
|
||
dTextHeight = _tstof(csTextHeight);
|
||
|
||
// 获得第一轴圈的中心点半径
|
||
AcGePoint3d ptTextPos,
|
||
ptCenter = pAxisDim->GetLabelCenter(0, pAxisDim->GetAxisVisSides(pAxisDim->GetVisSides()));
|
||
// modify by xly on 110410 修改文字的对齐方式
|
||
// 单行文字对齐方式
|
||
//XExplodeDraw::TextAlignment nAlign = XExplodeDraw::kBottomLeft;
|
||
XExplodeDraw::TextAlignment nAlign = XExplodeDraw::kMiddleLeft;
|
||
|
||
{
|
||
// 轴网所在位置的判断
|
||
AcGeVector3d ver = ptCenter - ptAxisNear.AsAcGePoint3d();
|
||
dAngleVet = vtCurXAxis.angleTo(ver, AcGeVector3d::kZAxis);
|
||
|
||
if (dAngleVet > PI * 0.5 + _angSnap && dAngleVet < PI + _angSnap)
|
||
{
|
||
acutPolar(asDblArray(ptCenter), dUcsAngle+PI, dRadCir * 1.2, asDblArray(ptTextPos));
|
||
//nAlign = XExplodeDraw::kBottomRight;
|
||
nAlign = XExplodeDraw::kMiddleRight;
|
||
}
|
||
else
|
||
{
|
||
acutPolar(asDblArray(ptCenter), dUcsAngle, dRadCir * 1.2, asDblArray(ptTextPos));
|
||
}
|
||
// delete by xly on 110410 修改文字的对齐方式
|
||
//acutPolar(asDblArray(ptTextPos), dUcsAngle-PI/2, dTextHeight * 0.5, asDblArray(ptTextPos));
|
||
}
|
||
|
||
|
||
if (bIsContinue) // 多轴,连续第一轴圈后的内容
|
||
{
|
||
if (csEnfAxis.IsEmpty())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// “~”文本的绘制
|
||
TDbText *pText = new TDbText();
|
||
pText->SetStyleId(InitTextStyle(TS_AXIS));
|
||
pText->SetHeight(dTextHeight, FALSE);
|
||
pText->SetText(_T("~"));
|
||
pText->SetAlignment(nAlign);
|
||
pText->SetLocation(ptTextPos);
|
||
|
||
// 获得文字的外包围框大小
|
||
XPoint ptMax, ptMin;
|
||
pText->SetLayoutRotation(0);
|
||
pText->GetExtents2d(ptMin, ptMax);
|
||
pText->SetLayoutRotation(dUcsAngle);
|
||
|
||
// modify by xly on 110316 设置文字的图层在轴号的文字图层
|
||
//pText->AddToMSpace(Adesk::kTrue);
|
||
AcDbObjectId id = pText->AddToMSpace(Adesk::kTrue);
|
||
if (Acad::eOk ==acdbOpenObject(pText, id,AcDb::kForWrite))
|
||
{
|
||
pText->setLayer(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pText->close();
|
||
}
|
||
|
||
|
||
// 文字宽度
|
||
double dTextWidth = ptMax.x - ptMin.x;
|
||
|
||
// 终止轴线
|
||
AcGePoint3d ptNearAxisPos ,ptFarAxisPos;
|
||
ads_polar(asDblArray(ptCenter), nAxisDirection, dRadCir, asDblArray(ptNearAxisPos));
|
||
if (dAngleVet > PI * 0.5 + _angSnap && dAngleVet < PI + _angSnap)
|
||
{
|
||
ads_polar(asDblArray(ptNearAxisPos), dUcsAngle-PI, dRadCir*2.4+dTextWidth, asDblArray(ptNearAxisPos));
|
||
}
|
||
else
|
||
{
|
||
ads_polar(asDblArray(ptNearAxisPos), dUcsAngle, dRadCir*2.4+dTextWidth, asDblArray(ptNearAxisPos));
|
||
}
|
||
ads_polar(asDblArray(ptNearAxisPos), nAxisDirection, curve.GetLength()+2*dLenLeader, asDblArray(ptFarAxisPos));
|
||
|
||
// 声明轴标对象,设置相关内容
|
||
TDbAxisLabelSet *pNewAxisDim = new TDbAxisLabelSet;
|
||
pNewAxisDim->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pNewAxisDim->SetTextLayerId(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pNewAxisDim->SetLayoutRotation(dUcsAngle);
|
||
pNewAxisDim->AddAxis(XCurveSegment(ptNearAxisPos, ptFarAxisPos, 0.0, LS_FINITE), FALSE, csEnfAxis);
|
||
|
||
pNewAxisDim->SetLeaderLen(0, 0.0, TRUE);
|
||
pNewAxisDim->SetLeaderLen(1, 0.0, TRUE);
|
||
ASSERT(pNewAxisDim->IsValid());
|
||
pNewAxisDim->SetSortAuto(FALSE);
|
||
pNewAxisDim->HideSide(1);
|
||
pNewAxisDim->AddToMSpace(Adesk::kTrue);
|
||
|
||
continue;
|
||
}
|
||
|
||
// 文字类多轴号
|
||
CString csNextText = dlg.GetOtherAxis();
|
||
if (csNextText.IsEmpty()) // 文字部分为空
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TDbText *pText = new TDbText();
|
||
pText->SetStyleId(InitTextStyle(TS_AXIS));
|
||
pText->SetHeight(dTextHeight, FALSE);
|
||
pText->SetLayoutRotation(dUcsAngle);
|
||
pText->SetText(csNextText);
|
||
pText->SetAlignment(nAlign);
|
||
pText->SetLocation(ptTextPos);
|
||
|
||
pText->setLayer(InitLayer(_T("0")));
|
||
|
||
// modify by xly on 110316 设置文字的图层在轴号的文字图层
|
||
//pText->AddToMSpace(Adesk::kTrue);
|
||
AcDbObjectId id = pText->AddToMSpace(Adesk::kTrue);
|
||
if (Acad::eOk ==acdbOpenObject(pText, id,AcDb::kForWrite))
|
||
{
|
||
pText->setLayer(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pText->close();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////////////
|
||
// 手动标注
|
||
#if 0
|
||
/////////////////////////////////////////////////////////
|
||
// Command: 驱动轴网
|
||
void DriveAxis()
|
||
{
|
||
PickSet ss(SS_FREE);
|
||
adsout << _T("\n请选择参加驱动的轴网及相关的对象!");
|
||
if (ss.Get()!=RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
Entity entDim;
|
||
XPoint ptPick;
|
||
RBList mask(RTDXF0, _T("DIMENSION"), NULL), maskAxisNo(RTDXF0, _T("INSERT"), 2, _T("_AXISO*"), NULL);
|
||
int nRetCode=entDim.FilterSelect(_T("\n请选择第二道尺寸(点取驱动的一侧): "), mask, ptPick);
|
||
if (nRetCode!=RTNORM) return;
|
||
do
|
||
{
|
||
if (nRetCode!=RTNORM && nRetCode!=RTKWORD)
|
||
{
|
||
break;
|
||
}
|
||
if (nRetCode == RTKWORD)
|
||
{
|
||
SHads_command(RTSTR, _T(".UNDO"), RTSTR, _T("BACK"), RTNONE);
|
||
continue;
|
||
}
|
||
|
||
int nDimType;
|
||
entDim.GetData(70, &nDimType);
|
||
ASSERT(ADS>12);
|
||
nDimType &= ~(32+128);
|
||
if (nDimType!=0 && nDimType!=1 && nDimType!=5)
|
||
{
|
||
adsout << _T("\n请正确选择标注类型!");
|
||
continue;
|
||
}
|
||
|
||
XPoint ptLimStart, ptLimEnd, ptTextBaseline, ptArcCen;
|
||
if (nDimType == 5)
|
||
{
|
||
entDim.GetData(15, &ptArcCen);
|
||
}
|
||
|
||
entDim.GetData(13, &ptLimStart);
|
||
entDim.GetData(14, &ptLimEnd);
|
||
entDim.GetData(10, &ptTextBaseline);
|
||
double nDimDirection=0.0;
|
||
if (nDimType == 0) //Rotate,Horizontal,Vertical
|
||
{
|
||
entDim.GetData(50, &nDimDirection);
|
||
}
|
||
else if (nDimType == 1)
|
||
{
|
||
nDimDirection = ads_angle(ptLimStart, ptLimEnd);
|
||
}
|
||
|
||
XCurveSegment cvTextBase;
|
||
int nRetCode=0;
|
||
AcGeMatrix3d mat;
|
||
XVector3D vtMove;
|
||
if (nDimType == 5)
|
||
{
|
||
cvTextBase=XArc(ptArcCen, ads_distance(ptArcCen, ptTextBaseline),
|
||
ads_angle(ptArcCen, ptLimStart), ads_angle(ptArcCen, ptLimEnd));
|
||
XString sTextDim;
|
||
entDim.GetData(1, (TCHAR *)sTextDim);
|
||
if (!sTextDim)
|
||
{
|
||
double nAngle=cvTextBase.bulge*180/PI;
|
||
nRetCode=GetReal(_T("\n输入新的夹角"), nAngle, RSG_NONEG|RSG_NOZERO);
|
||
if (nRetCode == RTNORM)
|
||
{
|
||
double nRot=nAngle*PI/180-cvTextBase.bulge;
|
||
mat.setToRotation(nRot, AcGeVector3d(0,0,1), ptArcCen);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
adsout << _T("\n只能对角度标注进行驱动,不能对弧长标注进行驱动!");
|
||
continue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
cvTextBase=XLine(ptTextBaseline, nDimDirection);
|
||
XPoint ptLimS, ptLimE;
|
||
cvTextBase.ProjectToMe(ptLimStart, ptLimS);
|
||
cvTextBase.ProjectToMe(ptLimEnd, ptLimE);
|
||
cvTextBase.SetPoints(ptLimS, ptLimE);
|
||
|
||
XPoint ptBase = cvTextBase.FarPoint(ptPick);
|
||
XPoint ptDrive = cvTextBase.NearPoint(ptPick);
|
||
double nNewDist=cvTextBase.Length();
|
||
nRetCode = XGetDist(ptBase, _T("\n请输入新的距离"), nNewDist, RSG_NONEG);
|
||
|
||
XPoint ptDest;
|
||
ads_polar(ptBase, ads_angle(ptBase, ptDrive), nNewDist, ptDest);
|
||
vtMove = ptDest - ptDrive; //移动的位移
|
||
AcGeVector3d vtOffset(vtMove.x, vtMove.y, vtMove.z);
|
||
mat.setToTranslation(vtOffset);
|
||
}
|
||
|
||
if (nRetCode == RTCAN)
|
||
{
|
||
break;
|
||
}
|
||
if (nRetCode == RTNORM)
|
||
{
|
||
SHads_command(RTSTR, _T(".UNDO"), RTSTR, _T("MARK"), RTNONE); // Make a undo mark
|
||
XPoint ptBase = cvTextBase.FarPoint(ptPick);
|
||
XPoint ptDrive = cvTextBase.NearPoint(ptPick);
|
||
XLine lnDivider(ptDrive, cvTextBase.Direction(ptDrive)+PI/2.0);
|
||
int nDrvSide=1-lnDivider.OnWhichSide(ptBase);
|
||
long lCount=ss.Length();
|
||
PickSet ssTransformed(SS_FREE|SS_CREATE);
|
||
for (long lIndex=0L; lIndex<lCount; lIndex++)
|
||
{
|
||
Entity ent=ss[lIndex];
|
||
if (ent.In(ssTransformed))
|
||
{
|
||
continue;
|
||
}
|
||
BOOL bAxisNo=ent.MatchBase(maskAxisNo);
|
||
XDbObject obj(ent, AcDb::kForWrite);
|
||
if (!obj) continue;
|
||
AcDbEntity &dbEnt=obj;
|
||
if (bAxisNo) // 轴号
|
||
{
|
||
AcDbBlockReference *pBlock=AcDbBlockReference::cast(obj.m_pObject);
|
||
ASSERT(pBlock);
|
||
XPoint ptInsert=pBlock->position();
|
||
XPoint ptPrj;
|
||
ptInsert.Project(lnDivider, ptPrj);
|
||
if (ptInsert.Distance2d(ptPrj)<_DIST_SNAP || lnDivider.OnWhichSide(ptInsert) == nDrvSide)
|
||
{
|
||
pBlock->transformBy(mat);
|
||
}
|
||
continue;
|
||
}
|
||
else if (dbEnt.isKindOf(TDbWall::desc()))
|
||
{
|
||
TDbWall *pWall=TDbWall::cast(obj.m_pObject);
|
||
int nPrFlag1=pWall->startPoint&lnDivider;
|
||
int nPrFlag2=pWall->endPoint&lnDivider;
|
||
BOOL bTransForm=FALSE;
|
||
if (nPrFlag1!=PR_OUTSIDE && nPrFlag2!=PR_OUTSIDE)
|
||
{
|
||
bTransForm=TRUE;
|
||
}
|
||
else if (nPrFlag1 == PR_OUTSIDE && nPrFlag2 == PR_OUTSIDE
|
||
&& lnDivider.OnWhichSide(pWall->startPoint) == nDrvSide)
|
||
{
|
||
bTransForm=TRUE;
|
||
}
|
||
if (bTransForm)
|
||
{
|
||
DStack<TDbOpening> lstOpening;
|
||
pWall->GetOpenings(lstOpening, AcDb::kForWrite, FALSE);
|
||
for (int k=0; k<lstOpening.Length(); k++)
|
||
{
|
||
TDbOpening *pOp=lstOpening[k];
|
||
Entity entOp;
|
||
VERIFY(acdbGetAdsName(entOp.name, pOp->objectId()) == Acad::eOk);
|
||
if (!entOp.In(ssTransformed))
|
||
{
|
||
pOp->transformBy(mat);
|
||
ssTransformed += entOp;
|
||
}
|
||
pOp->close();
|
||
}
|
||
pWall->transformBy(mat);
|
||
continue;
|
||
}
|
||
/*
|
||
TDbOpening *pWin=TDbOpening::cast(obj.m_pObject);
|
||
ASSERT(pWin);
|
||
XPoint ptInsert=pWin->GetLocation();
|
||
XPoint ptPrj;
|
||
ptInsert.Project(lnDivider, ptPrj);
|
||
if (ptInsert.Distance2d(ptPrj)<_DIST_SNAP ||
|
||
CT_IsExactSameDrt(ads_angle(ptBase, ptDrive), ads_angle(ptPrj, ptInsert), _angSnap)) {
|
||
pWin->transformBy(mat);
|
||
}*/
|
||
}
|
||
else if (dbEnt.isKindOf(TDbColumn::desc()))
|
||
{
|
||
TDbColumn *pColu=TDbColumn::cast(obj.m_pObject);
|
||
ASSERT(pColu);
|
||
XPoly2D polyOutline=pColu->GetOutlinePoly();
|
||
polyOutline.SetElevation(lnDivider.StartPoint().z);
|
||
BOOL bIntsect=FALSE;
|
||
for (int n=0; n<polyOutline.TotalSegments();n++)
|
||
{
|
||
XCurveSegment seg;
|
||
polyOutline.Nth(n, seg);
|
||
seg.flag=LS_FINITE;
|
||
if (seg.Intersection(lnDivider, XPoint(), XPoint()))
|
||
{
|
||
bIntsect=TRUE;
|
||
break;
|
||
}
|
||
}
|
||
BOOL bDrive=bIntsect;
|
||
if (!bIntsect)
|
||
{
|
||
XPoint ptCen, ptPrj;
|
||
polyOutline.Center(ptCen);
|
||
ptCen.Project(lnDivider, ptPrj);
|
||
bDrive=CT_IsExactSameDrt(ads_angle(ptBase, ptDrive), ads_angle(ptPrj, ptCen), _angSnap);
|
||
}
|
||
if (bDrive)
|
||
{
|
||
pColu->transformBy(mat);
|
||
continue;
|
||
}
|
||
}
|
||
|
||
AcGePoint3dArray ptStretchArray;
|
||
Acad::ErrorStatus es = dbEnt.getStretchPoints(ptStretchArray);
|
||
if (es == Acad::eOk)
|
||
{
|
||
long nLenOfArray=ptStretchArray.length();
|
||
AcDbIntArray indices;
|
||
for (long i=0L; i<nLenOfArray; i++)
|
||
{
|
||
XPoint ptStretch = ptStretchArray[i];
|
||
XPoint ptPrj;
|
||
ptStretch.Project(lnDivider, ptPrj);
|
||
if (ads_distance(ptStretch, ptPrj)<_DIST_SNAP || lnDivider.OnWhichSide(ptStretch) == nDrvSide)
|
||
{
|
||
if (nDimType == 5)
|
||
{
|
||
AcDbIntArray indices0;
|
||
indices0.append(i);
|
||
XPoint ptDest=ptStretch;
|
||
((AcGePoint3d &)ptDest).transformBy(mat);
|
||
XVector3D vtOff=ptDest-ptStretch;
|
||
dbEnt.moveStretchPointsAt(indices0,vtOff);
|
||
}
|
||
else
|
||
{
|
||
indices.append(i);
|
||
}
|
||
}
|
||
}
|
||
if (nDimType!=5)
|
||
{
|
||
dbEnt.moveStretchPointsAt(indices,vtMove);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
while (ads_initget(0, _T("U"))
|
||
&& (nRetCode=entDim.FilterSelect(_T("\n回退(U)/请选择第二道尺寸标注(点取驱动的一侧): "), mask, ptPick)));
|
||
}
|
||
|
||
#endif
|
||
|
||
// add by xlc on 070730
|
||
// 线对齐
|
||
void AlignLine(PickSet ss, //[in]需对齐的实体
|
||
Entity en) //[in]对齐边界
|
||
{
|
||
OPENOBJ_BEGIN(en, AcDb::kForRead, AcDbLine, pLine);
|
||
if (pLine != NULL)
|
||
{
|
||
for (long i=0;i<ss.Length();i++)
|
||
{
|
||
AcGePoint3d ptTmp;
|
||
Entity ent=ss[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbLine, pLineNew);
|
||
|
||
if (pLineNew)
|
||
{
|
||
AcGePoint3dArray ptInt;
|
||
pLineNew->intersectWith(pLine,AcDb::kExtendThis,ptInt);
|
||
if (ptInt.length()>0)//修改线端点
|
||
{
|
||
pLineNew->upgradeOpen();
|
||
if (pLineNew->endPoint().distanceTo(ptInt[0])
|
||
<= pLineNew->startPoint().distanceTo(ptInt[0]))
|
||
{
|
||
pLineNew->setEndPoint(ptInt[0]);
|
||
}
|
||
else
|
||
{
|
||
pLineNew->setStartPoint(ptInt[0]);
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
// add by xlc on 070730
|
||
// 轴线对齐
|
||
// ss [in]要对齐的轴线
|
||
void AlignAxis(PickSet ss)
|
||
{
|
||
if (ss.Length() <= 1)
|
||
{
|
||
return;
|
||
}
|
||
|
||
//轴线分组
|
||
CArray<PickSet,PickSet> ssArray;
|
||
PickSet ssTmp(SS_CREATE);
|
||
ssTmp += ss[0L];
|
||
ssArray.Add(ssTmp);
|
||
|
||
for (long i = 1; i < ss.Length(); i++)
|
||
{
|
||
BOOL bFlag = FALSE;
|
||
Entity ent=ss[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbLine, pLineNew);
|
||
if (pLineNew)
|
||
{
|
||
AcGeVector3d vect=pLineNew->endPoint()-pLineNew->startPoint();
|
||
|
||
for (long j=0; j<ssArray.GetSize();j++)
|
||
{
|
||
PickSet eName(SS_FREE);
|
||
eName += ssArray[j];
|
||
|
||
long size=eName.Length();
|
||
for (long k=0;k<size;k++)
|
||
{
|
||
Entity en = eName[k];
|
||
OPENOBJ_BEGIN(en, AcDb::kForRead, AcDbLine, pLine);
|
||
if (pLine)
|
||
{
|
||
AcGeVector3d dir=pLine->endPoint()-pLine->startPoint();
|
||
if (dir.isParallelTo(vect))
|
||
{
|
||
ssArray[j] += ent;
|
||
|
||
bFlag = TRUE;
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if (j == ssArray.GetSize()-1)
|
||
{
|
||
PickSet sName(SS_CREATE);
|
||
sName += ent;
|
||
int aa=sName.Length();
|
||
ssArray.Add(sName);
|
||
|
||
bFlag = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
if (bFlag)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
//删除只有一条线的选择集
|
||
for (i = 0;i < ssArray.GetSize();i++)
|
||
{
|
||
if (ssArray[i].Length() <= 1)
|
||
{
|
||
ssArray.RemoveAt(i);
|
||
i--;
|
||
}
|
||
}
|
||
|
||
//计算外包边界
|
||
PickSet delEnt(SS_FREE);
|
||
for (i = 0;i < ssArray.GetSize();i++)
|
||
{
|
||
int c=ssArray[i].Length();
|
||
if (ssArray[i].Length() <= 1)
|
||
{
|
||
continue;
|
||
}
|
||
else
|
||
{
|
||
BOOL bFlag=FALSE; //是否打开实体
|
||
double rotAng=0.0;
|
||
|
||
Entity ent=ssArray[i][0L];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbLine, pLineNew);
|
||
if (pLineNew)
|
||
{
|
||
AcGeVector3d vect=pLineNew->endPoint()-pLineNew->startPoint();
|
||
rotAng = AcGeVector3d::kXAxis.angleTo(vect,AcGeVector3d::kZAxis);
|
||
bFlag = TRUE;
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
if (bFlag)
|
||
{
|
||
ads_matrix mat,matInv;
|
||
XPoint().GetRotationMatrix(-rotAng,mat);
|
||
AT_amatrix(mat,matInv);
|
||
|
||
ssArray[i].Transform(mat);
|
||
|
||
ads_point lowPt,upPt;
|
||
ssArray[i]. GetExtend(lowPt, upPt);
|
||
|
||
PickSet ssNew(SS_CREATE);
|
||
ssNew.IncludeBegin();
|
||
|
||
AcDbLine *line=new AcDbLine(asPnt3d(lowPt),AcGePoint3d(lowPt[0],upPt[1],lowPt[2]));
|
||
if (line)
|
||
{
|
||
line->setColorIndex(6);
|
||
AddToModelSpace(line,TRUE);
|
||
}
|
||
else
|
||
{
|
||
delete line;
|
||
}
|
||
AcDbLine *line2=new AcDbLine(asPnt3d(upPt),AcGePoint3d(upPt[0],lowPt[1],upPt[2]));
|
||
if (line)
|
||
{
|
||
line2->setColorIndex(6);
|
||
AddToModelSpace(line2,TRUE);
|
||
}
|
||
else
|
||
{
|
||
delete line2;
|
||
}
|
||
ssNew.IncludeEnd();
|
||
ssArray[i].Transform(matInv);
|
||
ssNew.Transform(matInv);
|
||
delEnt += ssNew;
|
||
}
|
||
}
|
||
}
|
||
|
||
//确定对齐边界
|
||
for (i = 0;;i++)
|
||
{
|
||
Entity enSel;
|
||
RBList rbMask2(RTDXF0, _T("LINE"), NULL);
|
||
int stat = enSel.FilterSelect(_T("\n请选择对齐边界<退出>:"),rbMask2);
|
||
if (stat == RTCAN || stat == RTERROR)
|
||
{
|
||
break;
|
||
}
|
||
else if (stat == RTNORM)
|
||
{
|
||
if (delEnt.IsInclude(enSel))
|
||
{
|
||
long j=0;
|
||
for (;j<delEnt.Length();j++)
|
||
{
|
||
if (enSel == delEnt[j])
|
||
{
|
||
AlignLine(ssArray[j/2],enSel);
|
||
break;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
delEnt.Erase();
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:轴网合并
|
||
void MergeAxis()
|
||
{
|
||
g_ssPickFirst.Free();
|
||
|
||
PickSet ss(SS_CREATE);
|
||
XString sLayer;
|
||
sLayer<<_T("DOTE,")<<LAY_AXIS;
|
||
|
||
RBList mask(RTDXF0, _T("LINE"), 8, (const TCHAR*)sLayer, NULL);
|
||
int nRet = SelectEntities(_T("\n请选择需要合并对齐的轴线<退出>:"),ss,mask);
|
||
if (nRet != RTNORM)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// if (!RemoveDupLine(ss))
|
||
if (!TchDupAxis::RemoveDupAxis(ss))
|
||
{
|
||
return;
|
||
}
|
||
|
||
PickSet ssEnt(SS_CREATE);
|
||
ssEnt += ss;
|
||
AlignAxis(ssEnt);
|
||
}
|
||
|
||
|
||
/*
|
||
// 对齐轴线
|
||
void AlignAxis()
|
||
{
|
||
XString sLayer;
|
||
sLayer<<_T("DOTE,")<<LAY_AXIS;
|
||
RBList mask(RTDXF0, _T("LINE"), 8, (const TCHAR*)sLayer, NULL);
|
||
|
||
while (1)
|
||
{
|
||
PickSet ss(SS_FREE);
|
||
int nRet = SelectEntities(_T("\n选择要对齐的轴线<退出>:"),ss,mask);
|
||
if (nRet == RTCAN||nRet == RTNONE||nRet == RTERROR)
|
||
break;
|
||
else if (nRet != RTNORM)
|
||
continue;
|
||
|
||
if (ss.Length() < 1)
|
||
continue;
|
||
|
||
//确定对齐边界
|
||
XPoint ptStart,ptEnd;
|
||
while (1)
|
||
{
|
||
nRet = ads_getpoint(NULL, _T("\n请输入轴线对齐边界线起点<退出>:"), ptStart);
|
||
if (nRet == RTCAN||nRet == RTNONE)
|
||
return;
|
||
else if (nRet != RTNORM)
|
||
continue;
|
||
else
|
||
{
|
||
while (1)
|
||
{
|
||
nRet = ads_getpoint(ptStart, _T("\n请输入轴线对齐边界线终点<退出>:"), ptEnd);
|
||
if (nRet == RTCAN||nRet == RTNONE)
|
||
return;
|
||
else if (nRet != RTNORM)
|
||
continue;
|
||
else
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (ptStart.Distance(ptEnd) < 1.0E-6)
|
||
{
|
||
adsout<<_T("\n无法进行操作!");
|
||
return;
|
||
}
|
||
|
||
AcGeVector3d vect=ptEnd.AsAcGePoint3d() - ptStart.AsAcGePoint3d();
|
||
vect.normalize();
|
||
|
||
AcDbLine *pLine=new AcDbLine(ptStart.AsAcGePoint3d()+vect*100000.0,ptStart.AsAcGePoint3d()-vect*100000.0);
|
||
if (pLine)
|
||
{
|
||
AddToModelSpace(pLine,FALSE);
|
||
pLine->downgradeOpen();
|
||
|
||
for (long i=0;i<ss.Length();i++)
|
||
{
|
||
AcGePoint3d ptTmp;
|
||
Entity ent=ss[i];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbLine, pLineNew);
|
||
|
||
if (pLineNew)
|
||
{
|
||
AcGePoint3dArray ptInt;
|
||
pLineNew->intersectWith(pLine,AcDb::kExtendBoth,ptInt);
|
||
if (ptInt.length()>0)//修改线端点
|
||
{
|
||
pLineNew->upgradeOpen();
|
||
if (pLineNew->endPoint().distanceTo(ptInt[0])
|
||
<= pLineNew->startPoint().distanceTo(ptInt[0]))
|
||
{
|
||
pLineNew->setEndPoint(ptInt[0]);
|
||
}
|
||
else
|
||
{
|
||
pLineNew->setStartPoint(ptInt[0]);
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
pLine->upgradeOpen();
|
||
pLine->erase(TRUE);
|
||
pLine->close();
|
||
}
|
||
else
|
||
{
|
||
delete pLine;
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
|
||
// 从当前图层标准文件LAYERDEF.DAT中,获取“轴线”图层名
|
||
CString GetAxisLayerName()
|
||
{
|
||
// 当前图层标准文件名
|
||
CString csFileName = _T("layerdef.dat");
|
||
|
||
// Zyu modify on 100730,适应64位平台的文件夹名称变化
|
||
// 完整路径
|
||
//CString csFullPath = g_sAppPath;
|
||
//csFullPath = csFullPath.Left(csFullPath.GetLength() - 7) + _T("\\sys\\") + csFileName;
|
||
CString csFullPath = g_sDwbPath;
|
||
csFullPath = csFullPath.Left(csFullPath.GetLength() - 5) + _T("\\sys\\") + csFileName;
|
||
|
||
// “轴线”图层名
|
||
CString csName;
|
||
|
||
CStdioFile file;
|
||
if (!file.Open(csFullPath, CFile::modeRead))
|
||
{
|
||
acutPrintf(CString(_T("\n打开文件 \"")) + csFullPath + _T("\" 失败!"));
|
||
return csName;
|
||
}
|
||
|
||
CString sString;
|
||
while (file.ReadString(sString)) // 逐行读取
|
||
{
|
||
TCHAR sKey[256] = _T("");
|
||
TCHAR sName[256] = _T("");
|
||
int nColor = 0;
|
||
TCHAR sLineType[256] = _T("");
|
||
TCHAR sNote[256] = _T("");
|
||
_stscanf(sString, _T("%s%s%d%s%s"), sKey, sName, &nColor, sLineType, sNote);
|
||
|
||
if (_tcscmp(sKey, _T("轴线")) != 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (_tcscmp(sName, _T("")) == 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
csName = sName; // 获取图层名称
|
||
break;
|
||
}
|
||
|
||
file.Close();
|
||
|
||
if (csName.IsEmpty())
|
||
{
|
||
acutPrintf(_T("\n获取轴线图层名称失败!"));
|
||
}
|
||
return csName;
|
||
}
|
||
|
||
// sg add 100511,增加对外部参照图纸的支持
|
||
void GetAllAxisLayerName(const CString &csLayerName, CStringArray &aryNames)
|
||
{
|
||
aryNames.Add(csLayerName); // 不存在外部参照图纸
|
||
|
||
// 获取所有图层名称
|
||
XSymbolList lstLayer(_T("LAYER"));
|
||
|
||
// 注:CAD里的外部参照图层,固定使用“|”,暂时写死
|
||
CString csFind = _T("|");
|
||
csFind += csLayerName;
|
||
|
||
// sg add 100811,追加需求,CAD里的外部参照图层,还有可能使用“$*$”符号
|
||
CString csFind2 = _T("$");
|
||
csFind2 += csLayerName;
|
||
|
||
int nLength = lstLayer.Length();
|
||
for (int i=0; i<nLength; i++)
|
||
{
|
||
CString csLayer = lstLayer[i];
|
||
if (csLayer.Find(csFind, 0) > -1) // 判断是否存在外部参照图纸
|
||
{
|
||
aryNames.Add(csLayer);
|
||
continue;
|
||
}
|
||
|
||
// sg add 100811,支持“$*$”类符号的外部参照图纸
|
||
// 注:有可能出现“轴网|$0$DOTE”和“$0$DOTE”两类情况,因此,只需要判断“$DOTE”即可,但有误差
|
||
if (csLayer.Find(csFind2, 0) > -1)
|
||
{
|
||
aryNames.Add(csLayer);
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
|
||
/////////////////////////////////////////////
|
||
// sg add 091223,新增命令:轴改线型
|
||
void Axis2Dote()
|
||
{
|
||
// 获取轴线图层名称
|
||
CString csLayerName = GetAxisLayerName();
|
||
if (csLayerName.IsEmpty())
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 获取线型ID
|
||
AcDbObjectId idDote = InitLineType(_T("DOTE")),
|
||
idContinuous = InitLineType(_T("CONTINUOUS"));
|
||
if (idDote.isNull() || !idDote.isValid() || idContinuous.isNull() || !idContinuous.isValid())
|
||
{
|
||
acutPrintf(_T("\n创建线型失败! 请确认Acad.lin中包含指定线型!"));
|
||
return;
|
||
}
|
||
|
||
// 获得所有正确的图层名
|
||
CStringArray aryLayers;
|
||
GetAllAxisLayerName(csLayerName, aryLayers);
|
||
|
||
bool bFlag = true; // 判断是否所有图层名都不包含
|
||
CStringArray aryDotes, aryContinuous;
|
||
|
||
// 获取轴线图层ID
|
||
// Zyu modify on 100726,去掉编译警告
|
||
//int nLength = aryLayers.GetSize(),
|
||
// i(0);
|
||
int nLength = (int)aryLayers.GetSize(),
|
||
i(0);
|
||
for (i=0; i<nLength; i++)
|
||
{
|
||
csLayerName = aryLayers.GetAt(i);
|
||
|
||
AcDbObjectId idLayer = GetLayerIdFromString(csLayerName);
|
||
if (idLayer.isNull() || !idLayer.isValid())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
|
||
OPENOBJ_BEGIN(idLayer, AcDb::kForRead, AcDbLayerTableRecord, pLayer);
|
||
if (pLayer == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
// 获取当前线型名称
|
||
AcDbObjectId idCurType = pLayer->linetypeObjectId();
|
||
|
||
// modify by xly on 110303 获得线型的名称
|
||
//if (idCurType == idDote)
|
||
//{
|
||
// aryContinuous.Add(csLayerName); // 将变成CONTINUOUS线形
|
||
//}
|
||
//else
|
||
//{
|
||
// aryDotes.Add(csLayerName); // 将变成DOTE线形
|
||
//}
|
||
|
||
OPENOBJ_BEGIN(idCurType, AcDb::kForRead, AcDbLinetypeTableRecord, pLineType);
|
||
if (pLineType)
|
||
{
|
||
const TCHAR* sLineType = NULL;
|
||
pLineType->getName(sLineType);
|
||
CString csName = sLineType;
|
||
|
||
if (csName.Find(_T("DOTE"))>-1)
|
||
{
|
||
aryContinuous.Add(csLayerName); // 将变成CONTINUOUS线形
|
||
}
|
||
else
|
||
{
|
||
aryDotes.Add(csLayerName); // 将变成DOTE线形
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
bFlag = false;
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
if (bFlag)
|
||
{
|
||
acutPrintf(_T("\n请确认轴线层与当前图层标准一致!"));
|
||
return;
|
||
}
|
||
|
||
// Zyu modify on 100726,强制转换,去除编译警告
|
||
//nLength = aryContinuous.GetSize();
|
||
nLength = (int)aryContinuous.GetSize();
|
||
if (nLength > 0)
|
||
{
|
||
csLayerName = aryContinuous.GetAt(0);
|
||
for (i=1; i<nLength; i++)
|
||
{
|
||
csLayerName += _T(",");
|
||
csLayerName += aryContinuous.GetAt(i);
|
||
}
|
||
|
||
SHads_command(RTSTR, _T("-layer"), RTSTR, _T("l"), RTSTR, _T("CONTINUOUS"), RTSTR, csLayerName, RTSTR, _T(""), RTNONE);
|
||
}
|
||
|
||
// Zyu modify on 100726,强制转换,去除编译警告
|
||
//nLength = aryDotes.GetSize();
|
||
nLength = (int)aryDotes.GetSize();
|
||
if (nLength > 0)
|
||
{
|
||
csLayerName = aryDotes.GetAt(0);
|
||
for (i=1; i<nLength; i++)
|
||
{
|
||
csLayerName += _T(",");
|
||
csLayerName += aryDotes.GetAt(i);
|
||
}
|
||
|
||
SHads_command(RTSTR, _T("-layer"), RTSTR, _T("l"), RTSTR, _T("DOTE"), RTSTR, csLayerName, RTSTR, _T(""), RTNONE);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// [2010-4-20 wubo] 新增命令:轴号隐现
|
||
void ShowAndHideAxisDim()
|
||
{
|
||
static bool s_bHideAxisDim = true; // 保存是否“隐藏轴号”
|
||
static bool s_bSingleSideDim = true; // 保存是否“单侧操作”
|
||
|
||
// 所有的轴标集实体都显示隐藏的轴标
|
||
SetShowHiddenAxisLable(true);
|
||
|
||
TADSGePoint3d ptStart;
|
||
TADSGePoint3d ptEnd;
|
||
CString sPrompt;
|
||
|
||
//add by lgy 20120214 9.0将所有隐藏的轴号都能通过轴号隐现显示出来
|
||
BOOL bShow = TRUE; //由整侧不显示改为整侧中每一个轴号都不显示
|
||
|
||
while (true)
|
||
{
|
||
// 生成提示字符串,如:
|
||
// 请选择需隐藏的轴号或 [显示轴号(F)/设为双侧操作(Q), 当前: 单侧隐藏] <退出>:
|
||
sPrompt = _T("\n请选择需");
|
||
sPrompt += s_bHideAxisDim ? _T("隐藏") : _T("显示");
|
||
sPrompt += _T("的轴号或 [");
|
||
sPrompt += s_bHideAxisDim ? _T("显示") : _T("隐藏");
|
||
sPrompt += _T("轴号(F)/设为");
|
||
sPrompt += s_bSingleSideDim ? _T("双侧") : _T("单侧");
|
||
sPrompt += _T("操作(Q), 当前: ");
|
||
sPrompt += s_bSingleSideDim ? _T("单侧"): _T("双侧");
|
||
sPrompt += s_bHideAxisDim ? _T("隐藏") : _T("显示");
|
||
sPrompt += _T("] <退出>:");
|
||
|
||
int iRet = 0;
|
||
INITGET_BEG(0, _T("F Q"));
|
||
iRet = acedGetPoint(NULL, sPrompt, ptStart);
|
||
INITGET_END();
|
||
if (iRet == RTKWORD)
|
||
{
|
||
TCHAR szKey[132];
|
||
if (acedGetInput(szKey) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (szKey[0] == _T('F') || szKey[0] == _T('f'))
|
||
{
|
||
s_bHideAxisDim = !s_bHideAxisDim;
|
||
}
|
||
else if (szKey[0] == _T('Q') || szKey[0] == _T('q'))
|
||
{
|
||
s_bSingleSideDim = !s_bSingleSideDim;
|
||
}
|
||
|
||
continue;
|
||
}
|
||
else if (iRet == RTNORM)
|
||
{
|
||
if (GetCornerPoint(ptStart, NULL, ptEnd) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 选择框选范围中的TDbAxisLabelSet对象
|
||
TGGePoly2D extentPoly = GetExtentPolyByTwoCorner(ptStart, ptEnd);
|
||
TRBList rbRegion = extentPoly.Polygon();
|
||
TPickEntSet ssAxisLable(SS_FREE);
|
||
if (ssAxisLable.Get(_T("CP"), rbRegion, NULL,
|
||
TRBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
extentPoly.TransUCS(Groups(1), Groups(0));
|
||
|
||
long num = ssAxisLable.Length();
|
||
for (long i = 0; i < num; i++)
|
||
{
|
||
OPENOBJ_BEGIN(ssAxisLable[i], AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
if (pSet == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
//add by lgy 20120214 9.0将所有隐藏的轴号都能通过轴号隐现显示出来
|
||
int iSide = -1;
|
||
if(pSet->GetHideSide() == ANF_HIDESIDE1)
|
||
{
|
||
iSide = 0;
|
||
}
|
||
else if (pSet->GetHideSide() == ANF_HIDESIDE2)
|
||
{
|
||
iSide = 1;
|
||
}
|
||
|
||
int iAxisCount = pSet->GetAxisNum();
|
||
for (int j = 0; j < iAxisCount; j++)
|
||
{
|
||
for (int k = 0; k <= 1; k++)
|
||
{
|
||
// 对于框选范围中的每个TDbAxisLabelSet对象,
|
||
// 判断其中的每个Label是否在框选范围内
|
||
TADSGePoint3d ptLabelCenter = pSet->GetLabelCenter(j, k);
|
||
int iRelativePosition = ptLabelCenter & extentPoly;
|
||
// 如果Label在框选范围内,则进行相应的显示或隐藏操作
|
||
if (iRelativePosition != PR_OUTSIDE)
|
||
{
|
||
//add by lgy 20120214 9.0将所有隐藏的轴号都能通过轴号隐现显示出来
|
||
if ((iSide == k)&&!s_bHideAxisDim&&bShow)
|
||
{
|
||
pSet->HideSide(k, FALSE);
|
||
for (int m = 0; m < iAxisCount; m++)
|
||
{
|
||
pSet->HideAxisLabel(m, k, TRUE);
|
||
}
|
||
bShow = FALSE;
|
||
}
|
||
|
||
// 单侧操作情况下,只设置本侧
|
||
if (s_bSingleSideDim)
|
||
{
|
||
pSet->HideAxisLabel(j, k, s_bHideAxisDim);
|
||
}
|
||
// 双侧操作情况下,设置两侧
|
||
else
|
||
{
|
||
pSet->HideAxisLabel(j, 0, s_bHideAxisDim);
|
||
pSet->HideAxisLabel(j, 1, s_bHideAxisDim);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 所有的轴标集实体都不显示隐藏的轴标
|
||
SetShowHiddenAxisLable(false);
|
||
}
|
||
|
||
|
||
|
||
// 判断轴号的主附
|
||
bool IsMajorNo(CString csLable)
|
||
{
|
||
int iIndex = csLable.Find(_T("/"));
|
||
if (iIndex>-1)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// add by xly on 10415 查找第一个非自己的主轴号
|
||
int FindMajor(TDbAxisLabelSet *pSet, int nIndex)
|
||
{
|
||
int i =0;
|
||
CString csLabel;
|
||
int iLen = pSet->GetAxisNum();
|
||
for (i = 0; i<iLen; i++)
|
||
{
|
||
csLabel = pSet->GetLabel(i);
|
||
if (nIndex>-1)
|
||
{
|
||
if(!IsMajorNo(csLabel)&&i!=nIndex)
|
||
{
|
||
return i;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(!IsMajorNo(csLabel))
|
||
{
|
||
return i;
|
||
}
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
// 查找轴网中第一个主轴号,返回主轴号的位置
|
||
int FindMajor(TDbAxisLabelSet *pSet)
|
||
{
|
||
int i =0;
|
||
CString csLabel;
|
||
int iLen = pSet->GetAxisNum();
|
||
for (i = 0; i<iLen; i++)
|
||
{
|
||
csLabel = pSet->GetLabel(i);
|
||
if(!IsMajorNo(csLabel))
|
||
{
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:主附转换
|
||
void ExchangeAxisNo()
|
||
{
|
||
static bool s_bM2AAxisDim = true; // 保存是否“主轴号变附加轴号”
|
||
static bool s_bReAAxisDim = true; // 保存是否“重排轴号”
|
||
|
||
// sg add 100521,进入命令后,临时显示全部隐藏轴号
|
||
SetShowHiddenAxisLable(true);
|
||
|
||
int nRet = 0;
|
||
CString csPrompt;
|
||
TADSGePoint3d ptStart, ptEnd;
|
||
|
||
while (true)
|
||
{
|
||
// 生成提示字符串
|
||
// 请选择需主号变附的轴号或[附号变主(F)/设为不重排(Q), 当前: 重排]<退出>:
|
||
csPrompt = _T("\n请选择需");
|
||
csPrompt += s_bM2AAxisDim ? _T("主号变附") : _T("附号变主");
|
||
csPrompt += _T("的轴号或 [");
|
||
csPrompt += s_bM2AAxisDim ? _T("附号变主") : _T("主号变附");
|
||
csPrompt += _T("(F)/设为");
|
||
csPrompt += s_bReAAxisDim ? _T("不重排") : _T("重排");
|
||
csPrompt += _T("(Q), 当前: ");
|
||
csPrompt += s_bReAAxisDim ? _T("重排") : _T("不重排");
|
||
csPrompt += _T("] <退出>:");
|
||
|
||
INITGET_BEG(0, _T("F Q"));
|
||
nRet = acedGetPoint(NULL, csPrompt, ptStart);
|
||
INITGET_END();
|
||
if (nRet == RTKWORD) // 出现关键字
|
||
{
|
||
TCHAR szKey[132];
|
||
if (acedGetInput(szKey) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (szKey[0] == _T('F') || szKey[0] == _T('f')) // 是否“主轴号变附加轴号”
|
||
{
|
||
s_bM2AAxisDim = !s_bM2AAxisDim;
|
||
}
|
||
else if (szKey[0] == _T('Q') || szKey[0] == _T('q')) // 是否“重排轴号”
|
||
{
|
||
s_bReAAxisDim = !s_bReAAxisDim;
|
||
}
|
||
|
||
continue;
|
||
}
|
||
|
||
if (nRet != RTNORM) // 退出
|
||
{
|
||
break;
|
||
}
|
||
|
||
// 获得框选范围
|
||
if (GetCornerPoint(ptStart, NULL, ptEnd) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
TGGePoly2D extentPoly = GetExtentPolyByTwoCorner(ptStart, ptEnd);
|
||
TRBList rbRegion = extentPoly.Polygon();
|
||
|
||
// 在框选范围中,过滤TDbAxisLabelSet对象
|
||
TPickEntSet ssAxisLable(SS_FREE);
|
||
if (ssAxisLable.Get(_T("CP"), rbRegion, NULL, TRBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
extentPoly.TransUCS(Groups(1), Groups(0));
|
||
|
||
long lLabelsCount = ssAxisLable.Length();
|
||
if (lLabelsCount < 1)
|
||
{
|
||
continue; // 框选范围内,没有TDbAxisLabelSet对象
|
||
}
|
||
|
||
// 对框选范围中的每个TDbAxisLabelSet对象,进行检查、判断,确定是否在框选范围内
|
||
for (long l = 0; l < lLabelsCount; l++)
|
||
{
|
||
OPENOBJ_BEGIN(ssAxisLable[l], AcDb::kForRead, TDbAxisLabelSet, pSet);
|
||
if (pSet == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
int nSide = pSet->GetVisSides(); // 获取标注侧
|
||
if (nSide == 0)
|
||
{
|
||
continue; // 双侧都不标注
|
||
}
|
||
|
||
int nIndex = 0,
|
||
nTmpIndex = 0,
|
||
nAxisCount = pSet->GetAxisNum(); // 轴号数量
|
||
AcDbIntArray aryAxisInSel; // 保存选择到、需要变化的轴号索引
|
||
|
||
if (nSide == 1 || nSide == 3) // 只标第0侧,或双侧标注
|
||
{
|
||
TADSGePoint3d ptLabelCenter;
|
||
for (nIndex = 0; nIndex < nAxisCount; nIndex++)
|
||
{
|
||
ptLabelCenter = pSet->GetLabelCenter(nIndex, 0); // 获得标注点位置
|
||
if ((ptLabelCenter&extentPoly) != PR_OUTSIDE) // 判断Label点是否在框选范围内
|
||
{
|
||
if (!aryAxisInSel.find(nIndex, nTmpIndex))
|
||
{
|
||
aryAxisInSel.append(nIndex); // 找不到就添加
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (nSide == 2 || nSide == 3) // 只标第1侧,或双侧标注
|
||
{
|
||
TADSGePoint3d ptLabelCenter;
|
||
for (nIndex = 0; nIndex < nAxisCount; nIndex++)
|
||
{
|
||
ptLabelCenter = pSet->GetLabelCenter(nIndex, 1); // 获得标注点位置
|
||
if ((ptLabelCenter&extentPoly) != PR_OUTSIDE) // 判断Label点是否在框选范围内
|
||
{
|
||
if (!aryAxisInSel.find(nIndex, nTmpIndex))
|
||
{
|
||
aryAxisInSel.append(nIndex); // 找不到就添加
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取编号规则,变前项还是变后项
|
||
BOOL bChangePre = pSet->IsChangePreNum();
|
||
|
||
// modify by xly on 100816 解决选取第一个轴号为空时的错误处理,以及选择的第一个轴号是首个轴号时重排问题
|
||
//int nSelLength = aryAxisInSel.length(); // 保存总共选择了多少个轴号
|
||
//for (nIndex = 0; nIndex < nSelLength; nIndex++)
|
||
//{
|
||
// nTmpIndex = aryAxisInSel[nIndex];
|
||
//
|
||
// if (nTmpIndex == 0) // 获取到的轴号为第1根轴号,则获取其后面的一位内容,进行推导
|
||
// {
|
||
// if (nAxisCount > 1) // 多轴号
|
||
// {
|
||
//
|
||
// CString csLable = pSet->GetLabel(1);
|
||
|
||
// // 调用tch_kernal导出的推导轴号类,获取正确的标注内容
|
||
// XString csNext;
|
||
// XAxisNoParser parser(csLable, bChangePre);
|
||
// parser.GetPre(csNext, !s_bM2AAxisDim);
|
||
|
||
// if (pSet->upgradeOpen() == Acad::eOk)
|
||
// {
|
||
// pSet->SetLabel(0, csNext, s_bReAAxisDim);
|
||
// pSet->downgradeOpen();
|
||
// }
|
||
//
|
||
// }
|
||
// else // 单轴号
|
||
// {
|
||
// }
|
||
// }
|
||
// else // 获取到的轴号不是第1根轴号,则获取前其前面的一位内容,进行推导
|
||
// {
|
||
// CString csLable = pSet->GetLabel(nTmpIndex - 1);
|
||
|
||
// // 调用tch_kernal导出的推导轴号类,获取正确的标注内容
|
||
// XString csNext;
|
||
// XAxisNoParser parser(csLable, bChangePre);
|
||
// parser.GetNext(csNext, !s_bM2AAxisDim);
|
||
|
||
// if (pSet->upgradeOpen() == Acad::eOk)
|
||
// {
|
||
// pSet->SetLabel(nTmpIndex, csNext, s_bReAAxisDim);
|
||
// pSet->downgradeOpen();
|
||
// }
|
||
// }
|
||
//}
|
||
|
||
|
||
int nSelLength = aryAxisInSel.length(); // 保存总共选择了多少个轴号
|
||
if (nSelLength<1)
|
||
{
|
||
//return;
|
||
continue;
|
||
}
|
||
|
||
CString csLable, csNextLable;// 定义标记首根轴号,下一根轴号
|
||
bool bAxisStyle; // 定义标记轴号是否为分区轴号
|
||
|
||
// 获得第一个选择到的轴标
|
||
int iFirstNum = aryAxisInSel[0];
|
||
|
||
// 选择到的第一个轴标是首个轴标
|
||
if (iFirstNum<1)
|
||
{
|
||
// 查找主轴号
|
||
nIndex = FindMajor(pSet);
|
||
CString csLableFir = pSet->GetLabel(nIndex);
|
||
|
||
// modi fy by xly on 110414 修改带有首个轴号的主附变化
|
||
for (nIndex = 0; nIndex < nSelLength; nIndex++)
|
||
{
|
||
// 判断首跟轴号是否为空
|
||
csLable = pSet->GetLabel(nIndex);
|
||
if (csLable.IsEmpty())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 判断首根是否是附加轴号
|
||
bAxisStyle = IsMajorNo(csLable);
|
||
if (bAxisStyle)// 首根轴号是附加轴号
|
||
{
|
||
if (s_bM2AAxisDim)// 主变附
|
||
{
|
||
// 框选轴号是附加轴号,做主附转换重排,调整附加轴号顺序
|
||
if (s_bReAAxisDim)
|
||
{
|
||
int nPos = csLable.Find(_T('/'));
|
||
CString csOld = csLable.Right(csLable.GetLength()-nPos);
|
||
csNextLable.Format(_T("%d"),nSelLength-nIndex);
|
||
csLable = csNextLable;
|
||
csLable += csOld;
|
||
|
||
if (pSet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pSet->SetLabel(nIndex, csLable, FALSE);
|
||
pSet->downgradeOpen();
|
||
}
|
||
|
||
}
|
||
|
||
continue;
|
||
}
|
||
|
||
XAxisNoParser::GetRegion(csNextLable);
|
||
|
||
// 修改轴号
|
||
int unicode = (int)csLable.GetAt(csLable.GetLength()-1);
|
||
if (nIndex>0)
|
||
{
|
||
unicode++;
|
||
}
|
||
csLable.SetAt(csLable.GetLength()-1,(TCHAR)unicode);
|
||
int nPos = csLable.Find(_T('/'));
|
||
CString csNewLable = csLable.Right(csLable.GetLength()-nPos-1);
|
||
csNewLable.Remove(_T('0'));
|
||
csLable = csNewLable;
|
||
|
||
if (pSet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pSet->SetLabel(nIndex, csLable, s_bReAAxisDim);
|
||
// sg add 110614,由于底层限制,只能处理手工指定轴号为特殊的首个主轴号前的附加轴号
|
||
pSet->SetPreFirstAttachLabel(nIndex, FALSE);
|
||
pSet->downgradeOpen();
|
||
}
|
||
|
||
}
|
||
else// 轴号是主轴号
|
||
{
|
||
if (!s_bM2AAxisDim)// 附变主
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 主变附
|
||
// 获得轴根轴的标号,判断是否有标号
|
||
csLable = pSet->GetLabel(nIndex);
|
||
if (csLable.IsEmpty())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 转化为符合的样式
|
||
csNextLable = csLableFir;
|
||
XAxisNoParser::GetRegion(csNextLable);
|
||
|
||
CString csKvalue;
|
||
if(s_bReAAxisDim)
|
||
{
|
||
csKvalue.Format(_T("%d"),nSelLength-nIndex);
|
||
csLable = csKvalue;
|
||
csLable += csNextLable;
|
||
}
|
||
else
|
||
{
|
||
csKvalue.Format(_T("%d/"),1);
|
||
csLable = csKvalue;
|
||
csLable += pSet->GetLabel(nIndex);
|
||
}
|
||
|
||
// 更新首个轴号的标号
|
||
if (pSet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pSet->SetLabel(nIndex, csLable, s_bReAAxisDim);
|
||
// sg add 110614,由于底层限制,只能处理手工指定轴号为特殊的首个主轴号前的附加轴号
|
||
pSet->SetPreFirstAttachLabel(nIndex, TRUE);
|
||
pSet->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else// 选择到的第一个轴标不是首个轴标
|
||
{
|
||
for (nIndex = 0; nIndex < nSelLength; nIndex++)
|
||
{
|
||
// 框选到的轴号
|
||
nTmpIndex = aryAxisInSel[nIndex];
|
||
|
||
// 判断自己的前一个是否为空
|
||
CString csPreSlef = pSet->GetLabel(nTmpIndex - 1);
|
||
if (csPreSlef.IsEmpty())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 判断本身是否为空
|
||
csLable = pSet->GetLabel(nTmpIndex);
|
||
if (csLable.IsEmpty())
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// add by xly on 11007 增加变化判断
|
||
if (IsMajorNo(csLable))// 附加轴号
|
||
{
|
||
if (s_bM2AAxisDim)// 主变附
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
else// 主轴号
|
||
{
|
||
if (!s_bM2AAxisDim)// 附变主
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
|
||
// 查找第一个主轴号的位置
|
||
int iIndex = FindMajor(pSet);
|
||
if (iIndex<0)// 不存在主轴号
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// add by xly on 110307 框选轴号为第一个主轴号
|
||
if (iIndex == nTmpIndex)
|
||
{
|
||
int nTrueFir = FindMajor(pSet,iIndex);
|
||
if (nTrueFir<0)// 不存在主轴号
|
||
{
|
||
continue;
|
||
}
|
||
//bool bIsFenQu = XAxisNoParser::GetRegion(pSet->GetLabel(nTrueFir));
|
||
// 更新首个轴号的标号
|
||
if (pSet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
// 重排时,更新主轴号前面的所有轴号
|
||
if (s_bReAAxisDim)
|
||
{
|
||
int nPos = csPreSlef.Find(_T("/"));
|
||
int nTemp = nTmpIndex+1;
|
||
CString csTemp=_T("");
|
||
CString csRight = csPreSlef.Right(csPreSlef.GetLength()-nPos);
|
||
for (int i=0; i<nTmpIndex; i++)
|
||
{
|
||
csTemp.Format(_T("%d"),nTrueFir);
|
||
csPreSlef = csTemp;
|
||
csPreSlef += csRight;
|
||
pSet->SetLabel(i,csPreSlef,FALSE);
|
||
nTrueFir--;
|
||
}
|
||
csTemp.Format(_T("%d"),nTrueFir);
|
||
csPreSlef = csTemp;
|
||
csPreSlef += csRight;
|
||
}
|
||
else
|
||
{
|
||
csPreSlef = pSet->GetLabel(nTmpIndex);
|
||
CString csPre = _T("1/");
|
||
csPre += csPreSlef;
|
||
csPreSlef = csPre;
|
||
}
|
||
|
||
pSet->SetLabel(nTmpIndex, csPreSlef, s_bReAAxisDim);
|
||
pSet->downgradeOpen();
|
||
}
|
||
continue;
|
||
}
|
||
|
||
// 获得第一个主轴号的轴标
|
||
CString csMajorAxis = pSet->GetLabel(iIndex);
|
||
if (IsMajorNo(csPreSlef))// 判断前一个轴标是附加轴标
|
||
{
|
||
CString csTemp;
|
||
int iPos = csPreSlef.Find(_T("-"));
|
||
if (XAxisNoParser::GetRegion(csMajorAxis))// 判断主轴标的样式,带分区
|
||
{
|
||
if (iPos<0)// 前一个是不带分区的样式
|
||
{
|
||
// 将前一个轴标转化为符合的样式
|
||
csTemp = csPreSlef.Left(csPreSlef.Find(_T("/")));
|
||
csPreSlef = csTemp;
|
||
csPreSlef += csMajorAxis;
|
||
}
|
||
}
|
||
else// 主轴标不带分区
|
||
{
|
||
if (iPos>-1)// 前一个是带分区的样式
|
||
{
|
||
// 将前一个轴标转化为符合的样式
|
||
csTemp = csPreSlef.Left(csPreSlef.Find(_T("-")));
|
||
csPreSlef = csTemp;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 调用tch_kernal导出的推导轴号类,获取正确的标注内容
|
||
XString csNext;
|
||
XAxisNoParser parser(csPreSlef, bChangePre);
|
||
parser.GetNext(csNext, !s_bM2AAxisDim);
|
||
if (pSet->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pSet->SetLabel(nTmpIndex, csNext, s_bReAAxisDim);
|
||
pSet->downgradeOpen();
|
||
}
|
||
}
|
||
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
// sg add 100521,退出命令时,恢复隐藏
|
||
SetShowHiddenAxisLable(false);
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:一轴多号
|
||
// xly add 100520
|
||
void MutiAxisLabel()
|
||
{
|
||
static bool s_bSelectAllAxisDim = true; // 保存是否“选中全部轴号”
|
||
static short s_nCloneRowNum = 1; // 保存“复制行数”
|
||
|
||
// add by xly on 100811 添加单、双侧创建多轴号
|
||
static bool s_bDoubleSide = true; // 保存是否双侧创建多轴号
|
||
|
||
XPushVar<int> osmode(_T("OSMODE"), 0); // 进入命令后,临时关闭OSMODE
|
||
SetShowHiddenAxisLable(true); // 进入命令后,临时显示全部隐藏轴号
|
||
|
||
int nRet(0);
|
||
TADSGePoint3d ptStart, ptEnd; // 框选模式的两个点
|
||
PickSet ssLabel(SS_FREE); // 保存用户选中的轴号标注对象
|
||
|
||
if (g_bIgnoreAttach)
|
||
{
|
||
acutPrintf(_T("\n当前: 忽略附加轴号。状态可在高级选项中修改。"));
|
||
}
|
||
else
|
||
{
|
||
acutPrintf(_T("\n当前: 不忽略附加轴号。状态可在高级选项中修改。"));
|
||
}
|
||
|
||
bool bFlag = true; // 标记是否需要关键字
|
||
|
||
// CString csPrompt = // 命令行提示
|
||
// s_bSelectAllAxisDim?_T("\n请选择已有轴号或[框选轴圈局部操作 (Q)] <退出>:"):_T("\n请选择已有轴号或[选中轴号整体操作 (Q)] <退出>:");
|
||
// 命令行提示
|
||
CString csPrompt;
|
||
|
||
while (true)
|
||
{
|
||
// add by xly on 100811 添加单、双侧创建多轴号
|
||
// 提示语的格式请选择已有轴号或[选中轴号整体操作(F)/单侧创建多号(Q)]<退出>:
|
||
csPrompt = _T("\n请选择已有轴号或["); // 命令行提示
|
||
csPrompt += s_bSelectAllAxisDim?_T("框选轴圈局部操作(F)"):_T("选中轴号整体操作(F)");
|
||
csPrompt += _T("/");
|
||
csPrompt += s_bDoubleSide?_T("单侧创建多号(Q)"):_T("双侧创建多号(Q)");
|
||
csPrompt += _T("]<退出>:");
|
||
|
||
if (bFlag) // 需要提示关键字
|
||
{
|
||
INITGET_BEG(0, _T("F Q"));
|
||
nRet = acedGetPoint(NULL, csPrompt, ptStart);
|
||
INITGET_END();
|
||
}
|
||
else // 不需要提示关键字
|
||
{
|
||
// add by xly on 110316 设置提示
|
||
csPrompt = _T("\n请选择已有轴号:");
|
||
nRet = acedGetPoint(NULL, csPrompt, ptStart);
|
||
}
|
||
|
||
if (nRet == RTKWORD) // 关键字
|
||
{
|
||
TCHAR szKey[132];
|
||
if (acedGetInput(szKey) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// modify by xly on 100811 添加单、双侧创建多轴号
|
||
//if (szKey[0] == _T('Q') || szKey[0] == _T('q'))
|
||
//{
|
||
// s_bSelectAllAxisDim = !s_bSelectAllAxisDim;
|
||
// csPrompt = // 命令行提示
|
||
// s_bSelectAllAxisDim?_T("\n请选择已有轴号或[框选轴圈局部操作 (Q)] <退出>:"):_T("\n请选择已有轴号或[选中轴号整体操作 (Q)] <退出>:");
|
||
//}
|
||
|
||
if (szKey[0] == _T('F') || szKey[0] == _T('f'))// 框选还是整体
|
||
{
|
||
s_bSelectAllAxisDim = !s_bSelectAllAxisDim;
|
||
}
|
||
else if (szKey[0] == _T('Q') || szKey[0] == _T('q'))// 单侧还是双侧多轴号标注
|
||
{
|
||
s_bDoubleSide = !s_bDoubleSide;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
if (nRet != RTNORM) // 退出或操作结束
|
||
{
|
||
break;
|
||
}
|
||
// 输入另一个点
|
||
if (GetCornerPoint(ptStart, NULL, ptEnd) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 框选范围显示
|
||
TGGePoly2D poly = GetExtentPolyByTwoCorner(ptStart, ptEnd);
|
||
RBList rbRegion = poly.Polygon();
|
||
|
||
// 框选模式选择集
|
||
PickSet ssMouseSel(SS_FREE);
|
||
if (ssMouseSel.Get(_T("CP"), rbRegion, NULL, RBList(RTDXF0, _T("ATS_AXIS_LABEL"), NULL)) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
poly.TransUCS(Groups(1), Groups(0));
|
||
|
||
long l = 0,
|
||
lSelLength = ssMouseSel.Length(); // 选择集的长度
|
||
for (l = 0; l<lSelLength; l++)
|
||
{
|
||
Entity ent = ssMouseSel[l];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbAxisLabelSet, pSet);
|
||
if (pSet == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 克隆实体
|
||
TDbAxisLabelSet *pNewAxis = (TDbAxisLabelSet *)pSet->clone();
|
||
|
||
int nSide = pNewAxis->GetVisSides(),
|
||
nTmpIndex = 0;
|
||
|
||
// 只对框选中的轴圈操作时,遍历实体,寻找框选到的轴号
|
||
int iNum = 0,
|
||
iAxisNumLength = pNewAxis->GetAxisNum();
|
||
|
||
if (s_bSelectAllAxisDim) // 选中一个轴圈对整体操作
|
||
{
|
||
// add by xly on 100811 添加单、双侧创建多轴号
|
||
if (!s_bDoubleSide) // 单侧创建多轴号
|
||
{
|
||
// modify by xly on 110315 对每个轴圈的中心判断,以便准确查找
|
||
//AcGePoint3d ptCen = pNewAxis->GetLabelCenter(0, 0);
|
||
//if((ptCen&poly) != PR_OUTSIDE)// 选中0侧
|
||
//{
|
||
// pNewAxis->HideSide(1,TRUE);
|
||
//}
|
||
//else // 选中1侧
|
||
//{
|
||
// pNewAxis->HideSide(0,TRUE);
|
||
//}
|
||
bool bIsFir(false);
|
||
for(iNum=0; iNum<iAxisNumLength; iNum++)
|
||
{
|
||
AcGePoint3d ptCen = pNewAxis->GetLabelCenter(iNum, 0);
|
||
if((ptCen&poly) != PR_OUTSIDE)// 选中0侧
|
||
{
|
||
bIsFir = true;
|
||
break;
|
||
}
|
||
|
||
}
|
||
if (bIsFir)
|
||
{
|
||
pNewAxis->HideSide(1,TRUE);
|
||
}
|
||
else
|
||
{
|
||
pNewAxis->HideSide(0,TRUE);
|
||
}
|
||
}
|
||
|
||
ssLabel += pNewAxis->AddToMSpace(Adesk::kFalse);
|
||
pNewAxis->downgradeOpen();
|
||
pNewAxis->highlight();
|
||
pNewAxis->close();
|
||
|
||
continue;
|
||
}
|
||
|
||
AcDbIntArray aryAxisInSel;
|
||
|
||
if (nSide == 1 || nSide == 3) // 只标第0侧,或双侧标注
|
||
{
|
||
TADSGePoint3d ptLabelCenter;
|
||
for (iNum = 0; iNum < iAxisNumLength; iNum++)
|
||
{
|
||
ptLabelCenter = pNewAxis->GetLabelCenter(iNum, 0);
|
||
if ((ptLabelCenter&poly) != PR_OUTSIDE) // 在框选范围外
|
||
{
|
||
// add by xly on 100811 添加单、双侧创建多轴号
|
||
if (!s_bDoubleSide)// 单侧创建多轴号
|
||
{
|
||
pNewAxis->HideSide(1,TRUE);
|
||
}
|
||
if (!aryAxisInSel.find(iNum, nTmpIndex)) // 找不到就添加
|
||
{
|
||
aryAxisInSel.append(iNum);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (nSide == 2 || nSide == 3) // 只标第1侧,或双侧标注
|
||
{
|
||
TADSGePoint3d ptLabelCenter;
|
||
for (iNum = 0; iNum < iAxisNumLength; iNum++)
|
||
{
|
||
ptLabelCenter = pNewAxis->GetLabelCenter(iNum, 1);
|
||
if ((ptLabelCenter&poly) != PR_OUTSIDE) // 在框选范围内
|
||
{
|
||
// add by xly on 100811 添加单、双侧创建多轴号
|
||
if (!s_bDoubleSide)// 单侧创建多轴号
|
||
{
|
||
pNewAxis->HideSide(0,TRUE);
|
||
}
|
||
|
||
if (!aryAxisInSel.find(iNum, nTmpIndex)) // 找不到就添加
|
||
{
|
||
aryAxisInSel.append(iNum);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int nTemp = 0;
|
||
for (iNum = 0; iNum < iAxisNumLength; iNum++)
|
||
{
|
||
if (!aryAxisInSel.find(nTemp, nTmpIndex)) // 找不到,表示被选中,不删除
|
||
{
|
||
pNewAxis->RemoveLabel(iNum, FALSE);
|
||
iAxisNumLength--;
|
||
iNum--;
|
||
}
|
||
nTemp++;
|
||
}
|
||
ssLabel += pNewAxis->AddToMSpace(Adesk::kFalse);
|
||
pNewAxis->downgradeOpen();
|
||
pNewAxis->highlight();
|
||
pNewAxis->close();
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
// delete by xly on 110316 提到前面设置
|
||
//csPrompt = _T("\n请选择已有轴号:");
|
||
bFlag = false;
|
||
}
|
||
|
||
long lNewAixLength = ssLabel.Length();
|
||
if (lNewAixLength <= 0) // 没有选中的轴号,命令结束
|
||
{
|
||
SetShowHiddenAxisLable(false); // 退出命令时,恢复隐藏
|
||
return;
|
||
}
|
||
|
||
// 等待用户输入复制排数
|
||
int iNclone = s_nCloneRowNum;
|
||
acedInitGet(RSG_NONEG + RSG_NOZERO, NULL); // 输入不允许0和负数
|
||
|
||
csPrompt.Format(_T("\n请输入复制排数<%d>:"), s_nCloneRowNum);
|
||
nRet = acedGetInt(csPrompt, &iNclone);
|
||
if (nRet == RTCAN)
|
||
{
|
||
ssLabel.Erase();
|
||
SetShowHiddenAxisLable(false); // 退出命令时,恢复隐藏
|
||
return;
|
||
}
|
||
s_nCloneRowNum = iNclone;
|
||
|
||
|
||
// 创建新对象,并修改位置
|
||
for (long l = 0; l<lNewAixLength; l++)
|
||
{
|
||
Entity ent = ssLabel[l];
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbAxisLabelSet, pAxisDim);
|
||
if (pAxisDim == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
int iAxisNumLength = pAxisDim->GetAxisNum();
|
||
if (g_bIgnoreAttach) // 根据高级选项中的设置,确定是否忽略附加轴号
|
||
{
|
||
for (int i = 0; i < iAxisNumLength; i++)
|
||
{
|
||
CString csLabel = pAxisDim->GetLabel(i);
|
||
const TCHAR *pSep = _tcschr(csLabel, _T('/'));
|
||
if (pSep != NULL)
|
||
{
|
||
if (pAxisDim->upgradeOpen() == Acad::eOk)
|
||
{
|
||
pAxisDim->RemoveLabel(i, FALSE);
|
||
i--;
|
||
iAxisNumLength--;
|
||
pAxisDim->downgradeOpen();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (iAxisNumLength < 1)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// 获取轴号标注位置
|
||
XCurveSegment seg = pAxisDim->GetAxis(0);
|
||
|
||
TADSGePoint3d ptSt = seg.GetStartPoint(),
|
||
ptEn = seg.GetEndPoint();
|
||
double dStartDirection = seg.IDirection(1),
|
||
dEndDirection = seg.IDirection(0);
|
||
|
||
// 获取标注半径、两侧引线长度
|
||
double dRadCir = pAxisDim->GetCirRadius(FALSE),
|
||
dStartLength = pAxisDim->GetLeaderLen(0, FALSE),
|
||
dEndLength = pAxisDim->GetLeaderLen(1, FALSE);
|
||
|
||
TADSGePoint3d ptNear, ptFar;
|
||
|
||
// 生成多轴号的行数
|
||
for (int j = 1; j<=s_nCloneRowNum; j++)
|
||
{
|
||
dStartLength += dRadCir * 2;
|
||
dEndLength += dRadCir * 2;
|
||
|
||
// 生成新轴标
|
||
TDbAxisLabelSet *pAxisClon = (TDbAxisLabelSet *)pAxisDim->clone();
|
||
|
||
|
||
// 获得一个轴网标注的信息,是否是圆弧轴网
|
||
if(pAxisClon->IsArcAxisNet())
|
||
{
|
||
if (pAxisClon->IsArcAxis()) // 标注弧轴线
|
||
{
|
||
// 圆弧起始点的切线方向
|
||
dStartDirection = seg.Direction(ptSt);
|
||
dEndDirection = seg.Direction(ptEn);
|
||
|
||
// 圆弧的bugle值
|
||
double dBulge = seg.GetBulge();
|
||
|
||
// 计算新圆弧的起始点
|
||
acutPolar(ptSt, PI+(dStartDirection), dStartLength, ptNear);
|
||
acutPolar(ptEn, (dEndDirection), dEndLength, ptFar);
|
||
|
||
// 新圆弧的curve
|
||
XCurveSegment segNewArc(ptNear,ptFar,dBulge,1);
|
||
|
||
pAxisClon->AddToMSpace(Adesk::kFalse);
|
||
pAxisClon->SetFirstAxis(segNewArc);
|
||
|
||
// 设置两册的引线长度都为0
|
||
pAxisClon->SetLeaderLen(0, 0.0, TRUE);
|
||
pAxisClon->SetLeaderLen(1, 0.0, TRUE);
|
||
// sg modify 110607,根据测试反馈,如果存在拉伸情况,需要逐个修改每一个引线长度
|
||
pAxisClon->SetLeaderLenOneByOne(0, 0, TRUE);
|
||
pAxisClon->SetLeaderLenOneByOne(1, 0, TRUE);
|
||
pAxisClon->close();
|
||
|
||
}
|
||
else // 圆弧轴网在直线上的标注
|
||
{
|
||
int nSideHide(-1);
|
||
// 只有一个的情况
|
||
if (iAxisNumLength==1)
|
||
{
|
||
acutPolar(ptSt, dStartDirection, dStartLength, ptNear);
|
||
acutPolar(ptEn, dEndDirection, dStartLength, ptFar);
|
||
seg.SetPoints(ptNear, ptFar);
|
||
|
||
nSideHide = pAxisDim->GetHideSide();
|
||
if (nSideHide==4)
|
||
{
|
||
pAxisClon->HideSide(0,TRUE);
|
||
}
|
||
else if (nSideHide==8)
|
||
{
|
||
pAxisClon->HideSide(1,TRUE);
|
||
}
|
||
|
||
// 设置两册的引线长度都为0
|
||
pAxisClon->SetLeaderLen(0, 0.0, TRUE);
|
||
pAxisClon->SetLeaderLen(1, 0.0, TRUE);
|
||
// sg modify 110607,根据测试反馈,如果存在拉伸情况,需要逐个修改每一个引线长度
|
||
pAxisClon->SetLeaderLenOneByOne(0, 0, TRUE);
|
||
pAxisClon->SetLeaderLenOneByOne(1, 0, TRUE);
|
||
pAxisClon->SetFirstAxis(seg);
|
||
pAxisClon->AddToMSpace(Adesk::kFalse);
|
||
|
||
pAxisClon->close();
|
||
}
|
||
else// 多于1个轴号的添加一轴多号
|
||
{
|
||
XCurveSegment cvSortBase; // 排序的基线
|
||
|
||
// 保存起始轴线
|
||
XCurveSegment curveFirst,curveFinal;
|
||
// 获得起始轴线的信息
|
||
int nIndex(0);
|
||
for (int i=0;i<2;i++)
|
||
{
|
||
XCurveSegment segTemp = pAxisDim->GetAxis(nIndex);
|
||
ptSt = segTemp.GetStartPoint();
|
||
ptEn = segTemp.GetEndPoint();
|
||
dStartDirection = segTemp.IDirection(1);
|
||
dEndDirection = segTemp.IDirection(0);
|
||
|
||
acutPolar(ptSt, dStartDirection, dStartLength, ptNear);
|
||
acutPolar(ptEn, dEndDirection, dStartLength, ptFar);
|
||
segTemp.SetPoints(ptNear, ptFar);
|
||
nIndex = iAxisNumLength-1;
|
||
if (i==0)
|
||
{
|
||
curveFirst = segTemp;
|
||
}
|
||
if (i==1)
|
||
{
|
||
curveFinal = segTemp;
|
||
}
|
||
}
|
||
|
||
// 建立圆弧轴网中直线的圆弧
|
||
XPoint ptAxisNetCen = pAxisDim->GetArcNetCenter();
|
||
double nAng1 = ads_angle(ptAxisNetCen, curveFirst.FarPoint(ptAxisNetCen));
|
||
double nAng2 = ads_angle(ptAxisNetCen, curveFinal.FarPoint(ptAxisNetCen));
|
||
if (XAxisDimSet::g_AntiClockWise == FALSE)
|
||
{
|
||
Exchange(nAng1, nAng2);
|
||
}
|
||
cvSortBase = XArc(ptAxisNetCen, ptAxisNetCen.Distance2d(curveFirst.FarPoint(ptAxisNetCen)),
|
||
nAng1, nAng2);
|
||
|
||
// 建立排序的轴网单侧
|
||
XAxisDimSet dimSet(&cvSortBase);
|
||
for (i=0;i<iAxisNumLength;i++)
|
||
{
|
||
XCurveSegment segTemp = pAxisDim->GetAxis(i);
|
||
ptSt = segTemp.GetStartPoint();
|
||
ptEn = segTemp.GetEndPoint();
|
||
dStartDirection = segTemp.IDirection(1);
|
||
dEndDirection = segTemp.IDirection(0);
|
||
|
||
acutPolar(ptSt, dStartDirection, dStartLength, ptNear);
|
||
acutPolar(ptEn, dEndDirection, dEndLength, ptFar);
|
||
segTemp.SetPoints(ptNear, ptFar);
|
||
dimSet.Append(new XCurveSegment(segTemp));
|
||
}
|
||
dimSet.QuickSort(XAxisDimSet::SortFunc);
|
||
|
||
// 创建新的轴标
|
||
TDbAxisLabelSet *pAxisDim1 = new TDbAxisLabelSet;
|
||
pAxisDim1->SetTextStyleId(InitTextStyle(TS_AXIS));
|
||
pAxisDim1->SetTextLayerId(InitLayer(LAY_AXIS_TEXT, FALSE));
|
||
pAxisDim1->ConvertFrom(dimSet,true);
|
||
pAxisDim1->SetLayoutRotation(Ucs2Wcs(0.0));
|
||
pAxisDim1->SetLeaderLen(0, 0.0, TRUE);
|
||
pAxisDim1->SetLeaderLen(1, 0.0, TRUE);
|
||
// sg modify 110607,根据测试反馈,如果存在拉伸情况,需要逐个修改每一个引线长度
|
||
pAxisClon->SetLeaderLenOneByOne(0, 0, TRUE);
|
||
pAxisClon->SetLeaderLenOneByOne(1, 0, TRUE);
|
||
|
||
// 判断原有轴号的隐藏信息
|
||
nSideHide = pAxisDim->GetHideSide();
|
||
if (nSideHide==4)// 起始侧隐藏
|
||
{
|
||
pAxisDim1->HideSide(0,TRUE);
|
||
}
|
||
else if (nSideHide==8)// 终止侧隐藏
|
||
{
|
||
pAxisDim1->HideSide(1,TRUE);
|
||
}
|
||
|
||
|
||
pAxisDim1->SetLabel(0,pAxisDim->GetLabel(0),TRUE);
|
||
|
||
// add by xly on 110418 解决一周多号顺时针排序不正确的问题
|
||
if(XAxisDimSet::g_AntiClockWise==FALSE)
|
||
{
|
||
pAxisDim1->ReverseOrder();
|
||
}
|
||
pAxisDim1->AddToMSpace(Adesk::kTrue);
|
||
}
|
||
}
|
||
}
|
||
else // 直线轴网
|
||
{
|
||
acutPolar(ptSt, dStartDirection, dStartLength, ptNear);
|
||
acutPolar(ptEn, dEndDirection, dEndLength, ptFar);
|
||
|
||
seg.SetPoints(ptNear, ptFar);
|
||
|
||
pAxisClon->AddToMSpace(Adesk::kFalse);
|
||
pAxisClon->SetFirstAxis(seg);
|
||
|
||
// 设置两册的引线长度都为0
|
||
pAxisClon->SetLeaderLen(0, 0.0, TRUE);
|
||
pAxisClon->SetLeaderLen(1, 0.0, TRUE);
|
||
// sg modify 110607,根据测试反馈,如果存在拉伸情况,需要逐个修改每一个引线长度
|
||
pAxisClon->SetLeaderLenOneByOne(0, 0, TRUE);
|
||
pAxisClon->SetLeaderLenOneByOne(1, 0, TRUE);
|
||
|
||
pAxisClon->close();
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
SetShowHiddenAxisLable(false); // 退出命令时,恢复隐藏
|
||
ssLabel.Erase();
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////
|
||
// 命令:单根轴线
|
||
// sg add 110928,根据结构专业的需求,增加单根轴线的功能
|
||
void TAxislineCmd()
|
||
{
|
||
}
|