Files
envi-code/SourceCode/Code2026/tg_shs/shs_TwtKernal/ConcealInstallSanitarySys.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

122 lines
5.9 KiB
C++

#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<AcGePoint3d> 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<SanitaryNode> &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<double, std::pair<AcDbLine*, AcGePoint3d> > &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<AcDbObjectId,AcGePoint3d> m_mapSan;
};
#endif