#pragma once #ifdef _WIN32 #ifdef WIREROUTINGDLL_EXPORTS // VisualStudio DLL 项目模板会将 _EXPORTS 添加到定义预处理器宏。 #define BASIC_CHANNEL_API __declspec(dllexport) // _WIN32 #else #define BASIC_CHANNEL_API __declspec(dllimport) #endif #else #define BASIC_CHANNEL_API #endif #include "Bundle.h" #include #include #include #include #include #include #include #include using namespace std; // 根据卡箍相对位置估计基本的通道,并维护与此相关的分支点信息 struct BASIC_CHANNEL_API BasicChannel { Bundle bundles[N]; // 所有通道 int bundleNum; // 所有通道数量 int basicChannelNum; // 基本通道数量 map PointConnectedTobranchPoint[MAXPointNum]; // 连接到分支点的点 vector>> resClip; vector> resBranchPoint; vector startBranchPoint; vector endBranchPoint; vector BundleConnectedToBranchPoint[MAXPointNum]; // 连接到分支点的通道 int Out[N]; // 仅仅根据卡箍的相对位置创建近似的通道 void createChannel(); // 创建所有分支点 void createBranchPoint(); // 根据卡箍标号获取其所属的通道节点指针 BundleNode *getClipBundleNodePointer(int cid); // 获取卡箍属于的通道id int getClipBundleID(Clip *pc); int getClipBundleID(int cid); // 根据点获取其属于的bundleNode,不包括分支点,如果不存在就新创建一个 BundleNode *getBundleNodeByPoint(P &p, int inOut, int bundleID); // 获取卡箍在通道里的正方向 int getClipInOut(int cid); // 返回卡箍类型,0为孤立卡箍,1为断头卡箍,2为中间卡箍 int clipType(int cid); // 获取断头卡箍的进入通道方向 int getEXTClipInDir(Clip *pc); int getEXTClipInDir(int cid); // 获取中间卡箍在通道里的方向 int getMIDClipDir(int cid); /*判断一个分支点是否在通道中连接到一个卡箍 如果不连接返回-1 如果连接上返回由分支点连接到卡箍的方向 */ int isBranchPointConnectedToClip(int bid, int cid); /*判断一个卡箍是否在通道中连接到一个卡箍 如果不连接返回-1 如果连接上返回由卡箍1连接到卡箍2的方向 */ int isClipConnectedToClip(int cid1, int cid2); // 根据一个卡箍的集合返回附近所有卡箍和分支点的集合 vector getBranchPointAndClip(vector cv, int offset); /*合并两个bundle,短的并入长的 左边的bundle用指针pbd表示 右边的bundle用id表示 rev1,rev2分别代表左右两个bundle与path方向的关系 返回合并后的bundle与path的位置关系 pbd会指向合并后的bundle */ int mergeBundle(Bundle *&pbd, int bdid, int rev1, int rev2); // 加入一条路径来更新通道数据 void addPath(Path path); void printSingleBundle(int i, ofstream &ofs); // 把bundle信息按格式要求打印出来 void printBundle(string resultfile, bool basic = false); }; extern BASIC_CHANNEL_API BasicChannel basicChannel;