#ifndef _CONCEALINSTALLSANITARYSYS_H__ #define _CONCEALINSTALLSANITARYSYS_H__ #include "PartitionSanitarySys.h" #include "SanitarySysForFeedWater.h" class ConcealInstallSanitarySys: public SanitarySysForFeedWater { public: ConcealInstallSanitarySys(); virtual void AutoLinkSanitary(const SanitarySysData &data); // 给水管为立管时,给水点标高 void SetFeedPointEle(double dEle); private: struct LinkDate { AcDbLine *pLine; // 洁具连接的管线 AcGePoint3d ptSan; // 洁具点 AcGePoint3d ptInWall; // 暗装时洁具点到墙体的投影点 AcGePoint3d ptLink; // 连接到管线上的点 std::vector vecPts; // 连接过程中由于碰撞偏移连接线产生的点 按流向一次存储 AcDbObjectId idSan; // 洁具或立管id int nTransformTime; // 直接连接不满足要求时,可实施的转换次数 double dLinkLen; // 管线连接长度 bool bInWall; // 判断洁具点是否在墙内 }; private: // 独立洁具 bool IsSingleSanitary(const SanitarySysData &data); // 连接独立洁具 void LinkSingleSanitary(const SanitarySysData &data); // 连接洁具 void LinkSanitary(const SanitarySysData &data); // 根据洁具点连接洁具 void LinkSanitary(const AcGePoint3d &pt, const AcDbObjectId &idSan); // 根据洁具给水点ptSan,管线供水点ptFeed连接洁具 void LinkSanitary(const AcGePoint3d &ptSan, const AcGePoint3d &ptFeed, const AcDbObjectId &idSan, PipeType type, bool bInSanPtWall, const AcGePoint3d &ptWall); // 延长已有管线直接连接洁具 bool LinkSanitaryByExtendedPipe(const AcGePoint3d &pt, const AcDbObjectId &idSan); // 确定连接洁具时,产生的坐标系X轴和Y轴 void ComfirmXAxisYAxis(const AcDbObjectId &idPipe); // 给水点是非立管时,管线方向是否平行X轴或Y轴 bool PipeParallelXorYAxis(const AcDbObjectId &idPipe); // 在xoy平面洁具点距给水点pt距离由远到近排序 void Sort(std::vector &data, const AcGePoint3d &pt); // 给水管是立管时,确定主干 bool SelectMainPipeFromVPipe(const AcGePoint3d &ptWater, const AcGePoint3d &ptSan, const AcDbObjectId &idPipe, const AcDbObjectId &idSan); // 给水管是支管时,确定主干 bool SelectMainPipeFromPipe(const AcGePoint3d &ptWater, const AcGePoint3d &ptSan, const AcDbObjectId &idPipe, const AcDbObjectId &idSan); // 给水管为立管时,确认主干管位置 bool ConfirmMianPipePosFromVPipe(LinkDate &data, const AcDbObjectId &idPipe); // 给水管是非立管时,确认主干管位置 bool ConfirmMianPipePosFromPipe(LinkDate &data, const AcGeVector3d &vtPipeDir); // 检查是否可铺设主干管, 该管与其他管线间的平行间距 bool LayMainPipe(const AcGePoint3d &ptS, const AcGePoint3d &ptE, double dDist); // 连接主干管 bool LinkMainPipe(LinkDate &data); // 偏移主干管以便找到铺设主干管的位置 bool OffsetMainPipe(AcGePoint3d &ptS, AcGePoint3d &ptE, double dCollidenDist, double dOffsetDist, const AcGeVector3d &vtOffset, int nOffsetTime); // 根据直线起点,中点和偏移方向,找到不经过其他系统洁具点并且不碰撞其他系统管线的管线 bool GetPipe(AcGePoint3d &ptS, AcGePoint3d &ptE, const AcGeVector3d &vtDir); // 得到洁具点在vtDir负向上与其垂直的墙体暗装时投影点 bool GetPtInWall(AcGePoint3d &ptWall, const AcGePoint3d &ptSan,const AcGeVector3d &vtDir); // 管线流向由起点到终点 type表示管线类型用于是否可向管线连洁具 void CreateVirtualPipe(const AcGePoint3d &ptS, const AcGePoint3d &ptE, const PipeType &type); // 绘制管线 void CreatePipe(); // 管线方向 PipeDir GetPipeDir(const AcGeVector3d &vtDir); // 根据给水点修改给水管 void ModifyFeedPipe(); // 是否是管线 bool IsPipe(const AcDbObjectId idEnt); // 洁具实际是管线时,连接管线与给水点 bool LinkPipe(const AcGePoint3d &ptWater, const AcGePoint3d &ptS, const AcGePoint3d &ptE); // 获得连接洁具信息 bool GetLinkData(LinkDate &data); // 获得连接洁具信息 vtLink为洁具与管线直接连接时的方向 vtPipe为可连接管线的方向 vtOffset连接过程中的偏移方向 bool GetLinkData(LinkDate &data, const AcGeVector3d &vtLink, const AcGeVector3d &vtPipe, const AcGeVector3d &vtOffset); // 点到所有与vtDir平行的直线的距离和投影点 void GetPtToLineDist(std::multimap > &mapDist, const AcGePoint3d &pt, const AcGeVector3d &vtDir, PipeType type); // 连接洁具 void LinkSanitary2Pipe(const LinkDate &data); // 延长直线到pt点 void ExtendLine(AcDbLine *pLine, const AcGePoint3d &pt); // 为避免碰撞偏移直线 bool OffsetLine(AcGePoint3d &ptS, AcGePoint3d &ptE, double dCollideDist, const AcGeVector3d &vtOffset, int nOffsetTime); // 根据洁具方向,洁具点连接管线的方向,确定连接洁具时需要偏移的方向 void GetOffsetDir(AcGeVector3d &vtOffset, const AcGePoint3d &ptSan, const AcGeVector3d &vtSanitaryDir, const AcGeVector3d &vtLinkedPipe, const AcDbObjectId &idSan); // 立管绘制半径 double GetVPipeDrawRadius(); // 获得两点在xoy平面的间距 double GetDist(const AcGePoint3d &pt1, const AcGePoint3d &pt2); // 当洁具点在墙体外时,调整连接洁具点到墙体内 void ModifyLinkSanPt(LinkDate &data); // 供水点是否经过管线除端点外, 从供水点将线切断,分别生成管线设置流向 bool PipePassFeedPt(AcDbLine *pLine, const AcGePoint3d &ptFeed, const CString &sLayer); // 当给水管是管线时(非立管), 当主干管沿管线方向铺设时,管线可被延长但不该被缩短 void ModifyMainPipePt( AcGePoint3d &ptS, AcGePoint3d &ptE); // 添加附件 void InsertFeedEquip(); // 测试使用 private: void DrawSanitaryDir(const AcGePoint3d &pt, const AcGeVector3d &vtDir); private: // 给水管为立管时,给水点标高 double m_dVPipeEle; // 给水点 AcGePoint3d m_ptFeed; // 需要添加附件的洁具 std::map m_mapSan; }; #endif