2026-10-04 00:04:20 +08:00
/********************************************************************
2026-09-28 15:28:50 +08:00
created: 2004/03/18
created: 18:3:2004 11:28
filename: f:\tg_dev\telecdev\twtkernal\sprinkleredit.cpp
file path: f:\tg_dev\telecdev\twtkernal
file base: sprinkleredit
file ext: cpp
2026-10-04 00:04:20 +08:00
author: 沈睿
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
purpose: 喷头编辑文件, 主要是喷头定位
2026-09-28 15:28:50 +08:00
*********************************************************************/
#include "stdafx.h"
//#include <dbwall.h>
#include <TipWnd.h>
#include <DbEquipment.h>
#include <DbDimension.h>
#include "DbVPipeDim.h"
//***************************************************************************************************
2026-10-04 00:04:20 +08:00
// 喷头定位
2026-09-28 15:28:50 +08:00
//***************************************************************************************************
XCurveSegment GetBlkPickSegment ( Entity entBlk , XPoint ptPick , BOOL & bTrue );
2026-10-04 00:04:20 +08:00
// cet 2011.9.1 add 移动立管标注
2026-09-28 15:28:50 +08:00
void MoveVPipeDim ( const XPoint & pt , const AcGeMatrix3d & mat , double dLen )
{
PickSet ssDim ( SS_FREE );
RBList rbMaskDim ( RTDXF0 , _T ( "ATS_VPIPEDIM" ), NULL );
XRectAngle rect ( Wcs2Ucs ( pt ), dLen , dLen );
ssDim . Get ( _T ( "C" ), rect . GetLowLeft (), rect . GetUpRight (), rbMaskDim );
for ( long i = 0 ; i < ssDim . Length (); i ++ )
{
OPENOBJ_BEGIN ( ssDim [ i ], AcDb :: kForWrite , TDbVPipeDim , pDim );
if ( pDim != NULL )
{
pDim -> subTransformBy ( mat );
}
OPENOBJ_END ();
}
}
void DoModifySprinklerLoc ( Entity entRef , Entity entSprink , XPoint ptPick )
{
RBList rbMask = ads_buildlist ( - 4 , _T ( "<or" ),
- 4 , _T ( "<and" ), RTDXF0 , _T ( "ATS_EQUIPMENT" ), 8 , LAY_EQUIP_SPRINKLE , - 4 , _T ( "and>" ),
- 4 , _T ( "<and" ), RTDXF0 , _T ( "ATS_PIPE" ), 8 , LAY_PIPE_SPRINKLE , - 4 , _T ( "and>" ),
- 4 , _T ( "or>" ), NULL );
CPoint ptDwgView ;
int cvport = 0 ;
VERIFY ( xg_getvar ( _T ( "CVPORT" ), & cvport ) == RTNORM );
acedCoordFromWorldToPixel ( cvport , ptPick , ptDwgView );
CTemporaryResourceOverride vTmp ;
XPoint ptSprink ;
if ( entSprink . Is ( _T ( "ATS_EQUIPMENT" ))){
OPENOBJ_BEGIN ( entSprink , AcDb :: kForRead , TDbEquipment , pEquip );
if ( pEquip ){
ptSprink = pEquip -> GetLocation ();
ptSprink . z = 0 ;
}
OPENOBJ_END ();
}
else if ( entSprink . Is ( _T ( "ATS_PIPE" ))){
OPENOBJ_BEGIN ( entSprink , AcDb :: kForRead , TDbPipe , pPipe );
if ( ! pPipe || ! pPipe -> IsVertical ()){
2026-10-04 00:04:20 +08:00
AfxMessageBox ( _T ( "不是立管!" ));
2026-09-28 15:28:50 +08:00
return ;
}
ptSprink = pPipe -> StartPoint ();
ptSprink . z = 0 ;
OPENOBJ_END ();
}
CString csText ;
XPoint ptInt ;
double nDist ( 0 );
if ( entRef . Is ( _T ( "LINE" ))){
XLine line ( entRef , 1 );
ptSprink . Project ( & line , ptInt );
ptInt . z = 0 ;
nDist = ads_distance ( ptSprink , ptInt );
}
else if ( entRef . Is ( _T ( "ATS_EQUIPMENT" ))){
XPoint ptNewLoc ;
OPENOBJ_BEGIN ( entRef , AcDb :: kForRead , TDbEquipment , pEquip );
if ( pEquip ){
ptInt = pEquip -> GetLocation ();
ptInt . z = 0 ;
}
OPENOBJ_END ();
nDist = ads_distance ( ptSprink , ptInt );
}
else if ( entRef . Is ( _T ( "ATS_WALL" ))){
XCurveSegment lCurve , rCurve ;
OPENOBJ_BEGIN ( entRef , AcDb :: kForRead , TDbWall , pWall );
if ( pWall ) {
XPoint ptNew1 , ptNew2 ;
pWall -> GetSideCurve ( lCurve , rCurve );
lCurve . ProjectToMe ( ptSprink , ptNew1 );
rCurve . ProjectToMe ( ptSprink , ptNew2 );
ptNew1 . z = 0.0 ; // cet 2011.9.1 add
ptNew2 . z = 0.0 ; // cet 2011.9.1 add
double nDist1 = ads_distance ( ptSprink , ptNew1 );
double nDist2 = ads_distance ( ptSprink , ptNew2 );
if ( nDist1 < nDist2 ){
nDist = nDist1 ;
ptInt = ptNew1 ;
}
else {
nDist = nDist2 ;
ptInt = ptNew2 ;
}
}
OPENOBJ_END ();
}
else if ( entRef . Is ( _T ( "INSERT" ))) // cet 2011.5.24 add
{
XCurveSegment SelCurve ;
BOOL bIsLeft = TRUE ;
SelCurve = GetBlkPickSegment ( entRef , ptPick , bIsLeft );
if ( !! SelCurve )
{
XPoint ptTmp ;
ptSprink . Project ( & SelCurve , ptTmp );
ptTmp . z = 0.0 ; // cet 2011.9.1 add
nDist = ads_distance ( ptSprink , ptTmp );
ptInt = ptTmp ;
}
2026-10-04 00:04:20 +08:00
else // 获取参考失败直接返回
2026-09-28 15:28:50 +08:00
{
return ;
}
}
2026-10-04 00:04:20 +08:00
else if ( entRef . Is ( _T ( "ATS_COLUMN" ))) // cet 2011.8.31 add 支持柱子
2026-09-28 15:28:50 +08:00
{
XCurveSegment seg ;
OPENOBJ_BEGIN ( entRef , AcDb :: kForRead , TDbColumn , pColumn );
if ( pColumn != NULL )
{
XPoly2D poly ;
pColumn -> GetOutline ( poly );
int nNum = poly . TotalSegments ();
for ( int i = 0 ; i < nNum ; i ++ )
{
poly . Nth ( i , seg );
if ( seg . GetCurveType () == CURVE_LINE )
{
XLine line ( seg . GetStartPoint (), seg . GetEndPoint (), 1 );
if ( IsPtOnLine ( ptPick , line , 50 ))
{
break ;
}
}
}
}
OPENOBJ_END ();
2026-10-04 00:04:20 +08:00
if ( ! seg ) // 未找到直接返回
2026-09-28 15:28:50 +08:00
{
return ;
}
XPoint ptTmp ;
ptSprink . Project ( & seg , ptTmp );
ptTmp . z = 0.0 ;
nDist = ads_distance ( ptSprink , ptTmp );
ptInt = ptTmp ;
}
2026-10-04 00:04:20 +08:00
else if ( entRef . Is ( _T ( "LWPOLYLINE" )) || entRef . Is ( _T ( "POLYLINE" ))) // zxl 2013.10.30 add 支持pline线
2026-09-28 15:28:50 +08:00
{
XCurveSegment seg , seg1 ;
XPoly2D poly ( entRef );
int nNum = poly . TotalSegments ();
for ( int i = 0 ; i < nNum ; i ++ )
{
poly . Nth ( i , seg1 );
if ( seg1 . GetCurveType () == CURVE_LINE )
{
XLine line ( seg1 . GetStartPoint (), seg1 . GetEndPoint (), 0 );
if ( IsPtOnLine ( ptPick , line , 50 ))
{
seg = seg1 ;
break ;
}
}
}
2026-10-04 00:04:20 +08:00
if ( ! seg ) // 未找到直接返回
2026-09-28 15:28:50 +08:00
{
return ;
}
XPoint ptTmp ;
ptSprink . Project ( & seg , ptTmp );
ptTmp . z = 0.0 ;
nDist = ads_distance ( ptSprink , ptTmp );
ptInt = ptTmp ;
}
else
return ;
csText . Format ( _T ( "%.0f" ), nDist );
XPoint ptTmp ;
double nAng = ads_angle ( ptSprink , ptInt );
InitSheetHook ( TRUE );
CEdit * pEdit = new CEdit ();
pEdit -> Create ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN ,
CRect ( ptDwgView . x , ptDwgView . y , ptDwgView . x + 100 , ptDwgView . y + 20 ), acedGetAcadDwgView (), IDC_USER_SHEET_EDIT );
pEdit -> SetWindowText ( csText );
int lenText = csText . GetLength ();
pEdit -> SetSel ( 0 , lenText );
pEdit -> SetFocus ();
int nKey , ret ;
2026-10-04 00:04:20 +08:00
ads_prompt ( _T ( " \n 请在编辑框内输入新的距离<回车键完成, ESC键退出>" ));
2026-09-28 15:28:50 +08:00
while ( 1 ){
ret = ads_getint ( _T ( "" ), & nKey );
if ( ret == RTNONE && g_nKey != 0 ) {
if ( g_nKey == VK_ESCAPE )
break ;
if ( g_nKey == VK_RETURN || g_nKey == VK_RBUTTON ){
CString csTmp ;
pEdit -> GetWindowText ( csTmp );
double nEle = _tstof ( csTmp );
ads_polar ( ptSprink , nAng , nDist - nEle , ptTmp );
break ;
}
}
else if ( ret == RTCAN )
break ;
}
InitSheetHook ( FALSE );
if ( pEdit )
pEdit -> DestroyWindow ();
delete pEdit ;
if ( ! ptTmp )
return ;
if ( entSprink . Is ( _T ( "ATS_PIPE" ))){
AcGeMatrix3d mat ; // cet 2011.9.1 add
2026-10-04 00:04:20 +08:00
XPoint pt ; // cet 2011.9.1 add 立管原来位置
double dLen = 100 ; // cet 2011.9.1 add 标注搜索范围
2026-09-28 15:28:50 +08:00
OPENOBJ_BEGIN ( entSprink , AcDb :: kForWrite , TDbPipe , pPipe );
if ( ! pPipe || ! pPipe -> IsVertical ()){
return ;
}
2026-10-04 00:04:20 +08:00
// cet 2011.9.1 add 获得联动立管标注的矩阵
2026-09-28 15:28:50 +08:00
dLen = pPipe -> GetRadius () * pPipe -> GetPScale ();
pt = pPipe -> StartPoint ();
AcGeVector3d vt = ptTmp - pt ;
vt . z = 0.0 ;
mat . setToTranslation ( vt );
ptTmp . z = pPipe -> StartPoint (). z ;
pPipe -> SetStartPoint ( ptTmp );
ptTmp . z = pPipe -> EndPoint (). z ;
pPipe -> SetEndPoint ( ptTmp );
OPENOBJ_END ();
2026-10-04 00:04:20 +08:00
MoveVPipeDim ( pt , mat , dLen ); // cet 2011.9.1 add 移动立管编号
2026-09-28 15:28:50 +08:00
return ;
}
AcGeVector3d vectTmp ( ptTmp . x - ptSprink . x , ptTmp . y - ptSprink . y , 0 );
AcGeVector3d vectTmp2 ( ptSprink . x - ptTmp . x , ptSprink . y - ptTmp . y , 0 );
AcGeMatrix3d mat ;
mat . setToTranslation ( vectTmp2 );
XPushVar < int > vOsMode ( _T ( "OSMODE" ), 0 );
PickSet ss ( SS_FREE );
2026-10-04 00:04:20 +08:00
if ( SelectEntities ( _T ( " \n 请选择联动喷头及管线:<只移动本喷头>" ), ss , rbMask ) != RTNORM ){
2026-09-28 15:28:50 +08:00
ss += entSprink ;
OPENOBJ_BEGIN ( entSprink , AcDb :: kForWrite , TDbEquipment , pEquip );
if ( pEquip ){
ptTmp . z = pEquip -> GetLocation (). z ;
pEquip -> SetLocation ( ptTmp );
pEquip -> SetInsert ( ptTmp );
}
OPENOBJ_END ();
}
else {
ss += entSprink ;
2026-10-04 00:04:20 +08:00
// zxl 2013.11.05 modify 未考虑ucs
2026-09-28 15:28:50 +08:00
// SHads_command(RTSTR, _T("MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
// RT3DPOINT, &ptSprink, RT3DPOINT, &ptTmp, RTNONE);
TADSGePoint3d _pt1 ( Wcs2Ucs ( ptSprink )), _pt2 ( Wcs2Ucs ( ptTmp ));
SHads_command ( RTSTR , _T ( "MOVE" ), RTPICKS , ( TLong_ptr * ) ss , RTSTR , _T ( "" ),
RT3DPOINT , & _pt1 , RT3DPOINT , & _pt2 , RTNONE );
}
for ( long j = 0 ; j < ss . Length (); j ++ ){
Entity ent = ss [ j ];
XPoint ptOldLoc , ptNewLoc ;
OPENOBJ_BEGIN ( ent , AcDb :: kForRead , TDbEquipment , pEquip );
if ( pEquip ){
int num = pEquip -> GetInterfaceNum ();
ptNewLoc = pEquip -> GetLocation ();
ptOldLoc = ptNewLoc ;
ptOldLoc . TransformBy ( mat );
if ( num == 1 ){
TPipeInterface face ;
pEquip -> GetInterface ( 0 , face );
AcDbObjectId PipeId = face . m_idPipe ;
OPENOBJ_BEGIN ( PipeId , AcDb :: kForWrite , TDbPipe , pPipe );
if ( pPipe ){
XPoint ptStart , ptEnd ;
pPipe -> getStartPoint ( ptStart );
pPipe -> getEndPoint ( ptEnd );
if ( ptStart == ptOldLoc )
pPipe -> SetStartPoint ( ptNewLoc );
else if ( ptEnd == ptOldLoc )
pPipe -> SetEndPoint ( ptNewLoc );
}
OPENOBJ_END ();
}
}
OPENOBJ_END ();
}
PickSet ssDim ( SS_FREE );
RBList rbMaskDim ( RTDXF0 , _T ( "ATS_DIMENSION2" ), NULL );
XRectAngle rect ( ptSprink , 650 , 650 );
ssDim . Get ( _T ( "C" ), rect . GetLowLeft (), rect . GetUpRight (), rbMaskDim );
long len = ssDim . Length ();
ptSprink . z = 0 ;
for ( long i = 0 ; i < len ; i ++ ){
Entity entDim = ssDim [ i ];
OPENOBJ_BEGIN ( entDim , AcDb :: kForWrite , TDbDimension2 , pDim );
if ( pDim ){
AcGePoint3dArray gripPoints ;
AcDbIntArray osnapModes ;
AcDbIntArray geomIds ;
pDim -> getGripPoints ( gripPoints , osnapModes , geomIds );
int ptlen = gripPoints . length ();
for ( int n = 0 ; n < ptlen ; n ++ ) {
XPoint pti = gripPoints [ n ];
if ( pti == ptSprink ){
AcDbIntArray indices ;
indices . append ( n );
pDim -> moveGripPointsAt ( indices , vectTmp );
}
}
}
OPENOBJ_END ();
}
}
XCurveSegment GetBlkPickSegment ( Entity entBlk , XPoint ptPick , BOOL & bTrue )
{
2026-10-04 00:04:20 +08:00
//第一步,得到块参考矩阵
2026-09-28 15:28:50 +08:00
AcDbBlockReference * pBlkRef = NULL ;
AcDbObjectId id = NULL ;
acdbGetObjectId ( id , entBlk );
acdbOpenObject ( pBlkRef , id , AcDb :: kForRead );
if ( ! pBlkRef )
return XCurveSegment ();
AcGeMatrix3d mat = pBlkRef -> blockTransform ();
if ( pBlkRef )
pBlkRef -> close ();
double xscale ;
entBlk . GetData ( 41 , & xscale );
xscale = fabs ( xscale );
2026-10-04 00:04:20 +08:00
//第二步,得到块记录遍历器
2026-09-28 15:28:50 +08:00
TCHAR szBlkName [ 256 ];
entBlk . GetData ( 2 , szBlkName );
AcDbBlockTable * pBlockTable = NULL ;
AcDbBlockTableRecord * pRecord = NULL ;
acdbCurDwg () -> getBlockTable ( pBlockTable , AcDb :: kForRead );
if ( Acad :: eOk != pBlockTable -> getAt ( szBlkName , pRecord , AcDb :: kForRead ))
return XCurveSegment ();
pBlockTable -> close ();
if ( pRecord -> isFromExternalReference () == true ){
XPoint ptOrigin = pRecord -> origin ();
AcGeMatrix3d mat2 ;
mat2 . setToTranslation ( AcGeVector3d ( - ptOrigin [ 0 ], - ptOrigin [ 1 ], - ptOrigin [ 2 ]));
mat *= mat2 ;
}
AcDbBlockTableRecordIterator * pIterator = NULL ;
pRecord -> newIterator ( pIterator );
BOOL bIsWall5 = FALSE ;
XCurveSegment seg ;
if ( pRecord )
pRecord -> close ();
for ( pIterator -> start (); ! pIterator -> done (); pIterator -> step ()){
AcDbEntity * pEnt ;
pIterator -> getEntity ( pEnt , AcDb :: kForRead );
AcDbLine * pLine = NULL ;
TDbWall * pWall = NULL ;
TDbColumn * pColumn = NULL ; // cet 2011.8.31 add
// zxl 2013.10.30 add
Entity ent ;
ads_name name ;
acdbGetAdsName ( name , pEnt -> id ());
ent = name ;
2026-10-04 00:04:20 +08:00
if ( pWall = TDbWall :: cast ( pEnt )){ //特别支持5。0墙体
2026-09-28 15:28:50 +08:00
XCurveSegment lCurve , rCurve ;
pWall -> GetSideCurve ( lCurve , rCurve );
if ( lCurve . Is ( CURVE_LINE )){
AcGePoint3d ptStart = lCurve . GetStartPoint ();
ptStart = ptStart . transformBy ( mat );
AcGePoint3d ptEnd = lCurve . GetEndPoint ();
ptEnd = ptEnd . transformBy ( mat );
ptStart . z = 0.0 ; // cet 2011.9.1 add
ptEnd . z = 0.0 ; // cet 2011.9.1 add
XLine line ( asDblArray ( ptStart ), asDblArray ( ptEnd ), 1 );
seg = line ;
if ( IsPtOnLine ( ptPick , line , 50 )){
bTrue = TRUE ;
bIsWall5 = TRUE ;
pEnt -> close ();
delete pIterator ;
return seg ;
}
}
if ( rCurve . Is ( CURVE_LINE )){
AcGePoint3d ptStart = rCurve . GetStartPoint ();
ptStart = ptStart . transformBy ( mat );
AcGePoint3d ptEnd = rCurve . GetEndPoint ();
ptEnd = ptEnd . transformBy ( mat );
ptStart . z = 0.0 ; // cet 2011.9.1 add
ptEnd . z = 0.0 ; // cet 2011.9.1 add
XLine line ( asDblArray ( ptStart ), asDblArray ( ptEnd ), 1 );
seg = line ;
if ( IsPtOnLine ( ptPick , line , 50 )){
bIsWall5 = TRUE ;
bTrue = FALSE ;
pEnt -> close ();
delete pIterator ;
return seg ;
}
}
}
else if ( pLine = AcDbLine :: cast ( pEnt )) // cet 2011.5.24 add
{
AcGePoint3d ptStart , ptEnd ;
pLine -> getStartPoint ( ptStart );
pLine -> getEndPoint ( ptEnd );
ptStart = ptStart . transformBy ( mat );
ptEnd = ptEnd . transformBy ( mat );
ptStart . z = 0.0 ; // cet 2011.9.1 add
ptEnd . z = 0.0 ; // cet 2011.9.1 add
XLine line ( asDblArray ( ptStart ), asDblArray ( ptEnd ), 1 );
seg = line ;
if ( IsPtOnLine ( ptPick , line , 50 ))
{
bTrue = FALSE ;
pEnt -> close ();
delete pIterator ;
return seg ;
}
}
2026-10-04 00:04:20 +08:00
else if ( pColumn = TDbColumn :: cast ( pEnt )) // cet 2011.8.31 add 支持柱子
2026-09-28 15:28:50 +08:00
{
XPoly2D poly ;
pColumn -> GetOutline ( poly );
int nNum = poly . TotalSegments ();
XPoint ptS , ptE ;
for ( int i = 0 ; i < nNum ; i ++ )
{
poly . Nth ( i , seg );
if ( seg . GetCurveType () == CURVE_LINE )
{
ptS = seg . GetStartPoint ();
ptE = seg . GetEndPoint ();
ptS . TransformBy ( mat );
ptE . TransformBy ( mat );
ptS . z = 0.0 ;
ptE . z = 0.0 ;
XLine line ( ptE , ptS , 1 );
if ( IsPtOnLine ( ptPick , line , 50 ))
{
bTrue = FALSE ;
pEnt -> close ();
delete pIterator ;
seg . SetStartPoint ( ptS );
seg . SetEndPoint ( ptE );
return seg ;
}
}
}
}
2026-10-04 00:04:20 +08:00
else if ( ent . Is ( _T ( "LWPOLYLINE" )) || ent . Is ( _T ( "POLYLINE" ))) // zxl 2013.10.30 add 支持pline线
2026-09-28 15:28:50 +08:00
{
XPoly2D poly ( ent );
int nNum = poly . TotalSegments ();
XPoint ptS , ptE ;
XCurveSegment seg1 ;
for ( int i = 0 ; i < nNum ; i ++ )
{
poly . Nth ( i , seg1 );
if ( seg . GetCurveType () == CURVE_LINE )
{
ptS = seg1 . GetStartPoint ();
ptE = seg1 . GetEndPoint ();
ptS . TransformBy ( mat );
ptE . TransformBy ( mat );
ptS . z = 0.0 ;
ptE . z = 0.0 ;
XLine line ( ptE , ptS , 1 );
if ( IsPtOnLine ( ptPick , line , 50 ))
{
bTrue = FALSE ;
pEnt -> close ();
delete pIterator ;
seg . SetStartPoint ( ptS );
seg . SetEndPoint ( ptE );
return seg ;
}
}
}
}
pEnt -> close ();
}
if ( pIterator )
delete pIterator ;
return XCurveSegment ();
}
void SprinklerOrientation ()
{
Entity entSel ;
RBList rbMaskSel = ads_buildlist ( - 4 , _T ( "<or" ),
- 4 , _T ( "<and" ), RTDXF0 , _T ( "ATS_EQUIPMENT" ), 8 , LAY_EQUIP_SPRINKLE , - 4 , _T ( "and>" ),
2026-10-04 00:04:20 +08:00
- 4 , _T ( "<and" ), RTDXF0 , _T ( "ATS_PIPE" ), 8 , GetLayerNames ( _T ( "管" )), - 4 , _T ( "and>" ),
2026-09-28 15:28:50 +08:00
- 4 , _T ( "or>" ), NULL );
2026-10-04 00:04:20 +08:00
if ( SelectEntity ( _T ( " \n 请选择需要定位的喷头或立管<退出>:" ), entSel , rbMaskSel ) != RTNORM )
2026-09-28 15:28:50 +08:00
return ;
XPoint ptSprink ;
if ( entSel . Is ( _T ( "ATS_EQUIPMENT" ))){
OPENOBJ_BEGIN ( entSel , AcDb :: kForRead , TDbEquipment , pEquip );
if ( pEquip ){
ptSprink = pEquip -> GetLocation ();
ptSprink . z = 0 ;
}
OPENOBJ_END ();
}
else if ( entSel . Is ( _T ( "ATS_PIPE" ))){
OPENOBJ_BEGIN ( entSel , AcDb :: kForRead , TDbPipe , pPipe );
if ( ! pPipe || ! pPipe -> IsVertical ()){
2026-10-04 00:04:20 +08:00
AfxMessageBox ( _T ( "不是立管!" ));
2026-09-28 15:28:50 +08:00
return ;
}
ptSprink = pPipe -> StartPoint ();
ptSprink . z = 0 ;
OPENOBJ_END ();
}
entSel . Redraw ( 3 );
RBList rbMask1 ( RTDXF0 , _T ( "ATS_EQUIPMENT" ), 8 , LAY_EQUIP_SPRINKLE , NULL );
RBList rbMask2 ( RTDXF0 , _T ( "LINE" ), 8 , _T ( "*" ), NULL );
RBList rbMask3 ( RTDXF0 , _T ( "ATS_WALL" ), 8 , _T ( "*" ), NULL );
RBList rbMask4 ( RTDXF0 , _T ( "INSERT" ), 8 , _T ( "*" ), NULL );
RBList rbMask5 ( RTDXF0 , _T ( "ATS_COLUMN" ), 8 , _T ( "*" ), NULL ); // cet 2011.8.31 add
RBList rbMask6 ( RTDXF0 , _T ( "LWPOLYLINE" ), 8 , _T ( "*" ), NULL ); // zxl 2013.10.29 add
RBList rbMask7 ( RTDXF0 , _T ( "POLYLINE" ), 8 , _T ( "*" ), NULL ); // zxl 2013.10.29 add
int pickbox ;
int type ( 0 );
XPoint pt1 , pt2 ;
Entity entTag ;
PickSet ssAll ( SS_FREE );
VERIFY ( xg_getvar ( _T ( "PICKBOX" ), & pickbox ) == RTNORM );
CTipWnd * pTextDlg = NULL ;
2026-10-04 00:04:20 +08:00
ads_prompt ( _T ( " \n 请选择参考位置,如墙、喷头<退出>:" ));
2026-09-28 15:28:50 +08:00
for (;;) {
resbuf result ;
type = 2 ;
if ( ads_grread ( 5 , & type , & result ) != RTNORM ) break ;
if ( type != 5 && type != 3 && type != 12 && type != 11 ) break ;
pt1 [ 0 ] = result . resval . rpoint [ 0 ];
pt1 [ 1 ] = result . resval . rpoint [ 1 ];
pt1 [ 2 ] = 0.0 ;
if ( type == 3 ) {
PickSet s ( SS_FREE );
if ( ads_ssget ( NULL , pt1 , NULL , NULL , s ) == RTNORM ) {
entTag = s [ 0L ];
2026-10-04 00:04:20 +08:00
if ( ! entTag . MatchBase ( rbMask1 ) && ! entTag . MatchBase ( rbMask2 ) && ! entTag . MatchBase ( rbMask3 ) && ! entTag . MatchBase ( rbMask4 ) && ! entTag . MatchBase ( rbMask5 ) && ! entTag . MatchBase ( rbMask6 ) && ! entTag . MatchBase ( rbMask7 )) // cet 2011.8.31 modify 支持柱子
2026-09-28 15:28:50 +08:00
continue ;
if ( pTextDlg ) {
pTextDlg -> DestroyWindow ();
delete pTextDlg ;
pTextDlg = NULL ;
}
DoModifySprinklerLoc ( entTag , entSel , Ucs2Wcs ( pt1 ));
break ;
}
continue ;
}
2026-10-04 00:04:20 +08:00
else if ( type == 11 ){ //右键进行编辑
2026-09-28 15:28:50 +08:00
break ;
}
if ( ads_distance ( pt1 , pt2 ) > 0.1 ) {
if ( pTextDlg ) {
pTextDlg -> DestroyWindow ();
delete pTextDlg ;
pTextDlg = NULL ;
}
PickSet s ( SS_FREE );
if ( ads_ssget ( NULL , pt1 , NULL , NULL , s ) != RTNORM ) {
continue ;
}
Groups g1 ( 1 ), g0 ( 0 );
ads_trans ( XPoint ( pt1 ), ( resbuf * ) & g1 , ( resbuf * ) & g0 , 0 , pt1 );
2026-10-04 00:04:20 +08:00
// 构造WCS到Dcs的转换矩阵
2026-09-28 15:28:50 +08:00
AcGeMatrix3d transWcsToDcs ;
XPoint xAxesWcs ( 1 , 0 , 0 ), yAxesWcs ( 0 , 1 , 0 ), zAxesWcs ( 0 , 0 , 1 ),
xAxesDcs , yAxesDcs , zAxesDcs ;
XPoint ptOrginWcs ( 0 , 0 , 0 ), ptOrginDcs ( 0 , 0 , 0 );
Groups fromWcs ( 0 ), toDcs ( 2 );
ads_trans ( ptOrginWcs , ( resbuf * ) & fromWcs , ( resbuf * ) & toDcs , 0 , ptOrginDcs );
ads_trans ( xAxesWcs , ( resbuf * ) & fromWcs , ( resbuf * ) & toDcs , 1 , xAxesDcs );
ads_trans ( yAxesWcs , ( resbuf * ) & fromWcs , ( resbuf * ) & toDcs , 1 , yAxesDcs );
ads_trans ( zAxesWcs , ( resbuf * ) & fromWcs , ( resbuf * ) & toDcs , 1 , zAxesDcs );
transWcsToDcs . setCoordSystem ( ptOrginDcs , xAxesDcs , yAxesDcs , zAxesDcs );
double nMinDist = 0.0 ;
Entity entNearest ;
long lCount = s . Length ();
for ( long i = 0L ; i < lCount ; i ++ ) {
Entity ent = s [ i ];
2026-10-04 00:04:20 +08:00
if ( ! ent . MatchBase ( rbMask1 ) && ! ent . MatchBase ( rbMask2 ) && ! ent . MatchBase ( rbMask3 ) && ! ent . MatchBase ( rbMask4 ) && ! entTag . MatchBase ( rbMask5 ) && ! entTag . MatchBase ( rbMask6 ) && ! entTag . MatchBase ( rbMask7 )) // cet 2011.8.31 modify 支持柱子
2026-09-28 15:28:50 +08:00
continue ;
OPENOBJ_BEGIN ( ent , AcDb :: kForRead , AcDbEntity , pEnt );
if ( ! pEnt )
continue ;
AcGePoint3dArray points ;
XPoint ptTemp ;
AcDbIntArray ar ;
pEnt -> getOsnapPoints ( AcDb :: kOsModeNear , 0 , pt1 , ptTemp , transWcsToDcs , points , ar );
XPoint ptNear ;
if ( ! GetNearestPoint ( points , pt1 , ptNear ))
continue ;
ptNear . z = pt1 . z ;
double nDist = ptNear . Distance ( pt1 );
if ( ! entNearest || nDist < nMinDist ) {
entNearest = ent ;
nMinDist = nDist ;
}
OPENOBJ_END ();
}
if ( ! entNearest ) {
if ( lCount > 0 )
entNearest = s [ 0L ];
if ( ! entNearest )
continue ;
}
if ( entNearest == entSel )
continue ;
DList < CBlockStruct > lstInfo ;
double nDist ( 0 );
if ( entNearest . MatchBase ( rbMask2 )){
XLine line ( entNearest , 1 );
XPoint ptTmp ;
ptSprink . Project ( & line , ptTmp );
ptTmp . z = 0.0 ; // cet 2011.9.1 add
nDist = ads_distance ( ptSprink , ptTmp );
}
else if ( entNearest . MatchBase ( rbMask1 )){
XPoint ptNewLoc ;
OPENOBJ_BEGIN ( entNearest , AcDb :: kForRead , TDbEquipment , pEquip );
if ( pEquip ){
ptNewLoc = pEquip -> GetLocation ();
ptNewLoc . z = 0 ;
}
OPENOBJ_END ();
nDist = ads_distance ( ptSprink , ptNewLoc );
}
else if ( entNearest . MatchBase ( rbMask3 )){
XCurveSegment lCurve , rCurve ;
OPENOBJ_BEGIN ( entNearest , AcDb :: kForRead , TDbWall , pWall );
if ( pWall ) {
XPoint ptNew1 , ptNew2 ;
pWall -> GetSideCurve ( lCurve , rCurve );
lCurve . ProjectToMe ( ptSprink , ptNew1 );
rCurve . ProjectToMe ( ptSprink , ptNew2 );
ptNew1 . z = 0.0 ; // cet 2011.9.1 add
ptNew2 . z = 0.0 ; // cet 2011.9.1 add
nDist = ads_distance ( ptSprink , ptNew1 ) < ads_distance ( ptSprink , ptNew2 ) ? ads_distance ( ptSprink , ptNew1 ) : ads_distance ( ptSprink , ptNew2 );
}
OPENOBJ_END ();
}
2026-10-04 00:04:20 +08:00
else if ( entNearest . MatchBase ( rbMask4 )) //外部参考 2011-5-24 sr
2026-09-28 15:28:50 +08:00
{
XCurveSegment SelCurve ;
BOOL bIsLeft = TRUE ;
SelCurve = GetBlkPickSegment ( entNearest , pt1 , bIsLeft );
if ( !! SelCurve )
{
XPoint ptTmp ;
ptSprink . Project ( & SelCurve , ptTmp );
ptTmp . z = 0.0 ; // cet 2011.9.1 add
nDist = ads_distance ( ptSprink , ptTmp );
}
2026-10-04 00:04:20 +08:00
else // 获取参考失败直接返回
2026-09-28 15:28:50 +08:00
{
continue ;
}
}
2026-10-04 00:04:20 +08:00
else if ( entNearest . MatchBase ( rbMask5 )) // cet 2011.8.31 add 支持柱子
2026-09-28 15:28:50 +08:00
{
XCurveSegment seg ;
OPENOBJ_BEGIN ( entNearest , AcDb :: kForRead , TDbColumn , pColumn );
if ( pColumn != NULL )
{
XPoly2D poly ;
pColumn -> GetOutline ( poly );
int nNum = poly . TotalSegments ();
for ( int i = 0 ; i < nNum ; i ++ )
{
poly . Nth ( i , seg );
if ( seg . GetCurveType () == CURVE_LINE )
{
XLine line ( seg . GetStartPoint (), seg . GetEndPoint (), 1 );
if ( IsPtOnLine ( pt1 , line , 50 ))
{
break ;
}
}
}
}
OPENOBJ_END ();
2026-10-04 00:04:20 +08:00
if ( ! seg ) // 未找到直接返回
2026-09-28 15:28:50 +08:00
{
continue ;
}
XPoint ptTmp ;
ptSprink . Project ( & seg , ptTmp );
ptTmp . z = 0.0 ;
nDist = ads_distance ( ptSprink , ptTmp );
}
2026-10-04 00:04:20 +08:00
else if ( entNearest . MatchBase ( rbMask6 ) || entNearest . MatchBase ( rbMask7 )) // zxl 2013.10.30 add 支持pline线
2026-09-28 15:28:50 +08:00
{
XCurveSegment seg , seg1 ;
XPoly2D poly ( entNearest );
int nNum = poly . TotalSegments ();
for ( int i = 0 ; i < nNum ; i ++ )
{
poly . Nth ( i , seg1 );
if ( seg1 . GetCurveType () == CURVE_LINE )
{
XLine line ( seg1 . GetStartPoint (), seg1 . GetEndPoint (), 0 );
if ( IsPtOnLine ( pt1 , line , 50 ))
{
seg = seg1 ;
break ;
}
}
}
2026-10-04 00:04:20 +08:00
if ( ! seg ) // 未找到直接返回
2026-09-28 15:28:50 +08:00
{
continue ;
}
XPoint ptTmp ;
ptSprink . Project ( & seg , ptTmp );
ptTmp . z = 0.0 ;
nDist = ads_distance ( ptSprink , ptTmp );
}
else
continue ;
if ( fabs ( pt1 . z - pt2 . z ) < _distSnap && nDist > 0 ){
CBlockStruct * pInfo = new CBlockStruct ();
2026-10-04 00:04:20 +08:00
pInfo -> m_csRecord = _T ( "离喷头距离" );
2026-09-28 15:28:50 +08:00
pInfo -> m_csDesName . Format ( _T ( "%.0f" ), nDist );
lstInfo . Append ( pInfo );
}
else // cet 2011.5.24 add
{
continue ;
}
if ( ! pTextDlg ){
CPoint pt ;
int cvport ;
VERIFY ( xg_getvar ( _T ( "CVPORT" ), & cvport ) == RTNORM );
acedCoordFromWorldToPixel ( cvport , pt1 , pt );
acedGetAcadDwgView () -> ClientToScreen ( & pt );
acedGetAcadFrame () -> ScreenToClient ( & pt );
pTextDlg = new CTipWnd ();
pTextDlg -> Create ( lstInfo , pt . x + pickbox * 2 , pt . y + pickbox * 2 , acedGetAcadFrame ());
acedGetAcadDwgView () -> SetFocus ();
}
}
}
entSel . Redraw ( 4 );
if ( pTextDlg ){
pTextDlg -> DestroyWindow ();
delete pTextDlg ;
}
SHads_command ( RTSTR , _T ( ".REDRAW" ), RTNONE );
}