You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

295 lines
6.9 KiB

10 months ago
#include "stdafx.h"
#include"Connector.h"
#include<string>
#include<map>
#include <iomanip>
#include<vector>
#include<cmath>
#include<fstream>
#include<sstream>
using namespace std;
string ini="--";
//����
struct Pin{
string name,id;
P coord;
Pin(string name1,string id1){
name=name1;
id=id1;
}
Pin(string name1,string id1,P coord1){
name=name1;
id=id1;
coord=coord1;
}
Pin(){
name=id="";
}
};
//�߼��ϵĵ���
struct Wire{
string name;
Pin sn,en;
double diameter;
Wire(string name1,Pin sn1,Pin en1){
name=name1;sn=sn1;en=en1;
}
Wire(){
name="";
}
};
//�߼��ϵ�����
struct Bund{
vector<Wire> wirelist;
vector<string> wirenamelist;
P start,goal;
vector<P>path;
vector<double>d;
double dia;
double length;
Bund(){
dia=length=0;
}
};
map< pair<P,P> ,Bund> wire_node;
vector<Bund> wire_pairs;
map<string,P>mp;
map<string,Wire>wiremap;
map<string,string> pinidmap;
map<string,Pin>pinmap;
int cnt=0;
void init_readxml(){
wire_node.clear();
wire_pairs.clear();
mp.clear();
wiremap.clear();
pinidmap.clear();
pinmap.clear();
cnt=0;
}
void producePin(TiXmlElement* pin){
pinidmap[pin->Attribute("id")]=pin->Attribute("name");
}
string safegave(TiXmlElement* pEle,const char * t){
if(pEle->Attribute(t)==NULL)return ini;
else {
string v=pEle->Attribute(t);
if(v=="")return ini;
else return v;
}
}
TiXmlElement* GetNodePointerByName(TiXmlElement* pRootEle, const char* strNodeName)
{
// if equal root node then return
if (0 == strcmp(strNodeName, pRootEle->Value()))
{
return pRootEle;
}
TiXmlElement* pEle = pRootEle;
for (pEle = pRootEle->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
{
// recursive find sub node return node pointer
if (0 != strcmp(pEle->Value(), strNodeName))
{
TiXmlElement* res=GetNodePointerByName(pEle,strNodeName);
if(res!=NULL)return res;
}
else return pEle;
}
return NULL;
}
TiXmlElement* GetNextNodePointerByName(TiXmlElement* pRootEle, const char* strNodeName)
{
// if equal root node then return
TiXmlElement* pEle;
for (pEle = pRootEle->NextSiblingElement(); pEle; pEle = pEle->NextSiblingElement())
{
// recursive find sub node return node pointer
if (0 == strcmp(pEle->Value(), strNodeName))return pEle;
}
return NULL;
}
void produceConnector(TiXmlElement* pcon){
Connector con;
con.id=pcon->Attribute("id");
con.name=pcon->Attribute("name");
con.partnumber=pcon->Attribute("partnumber");
con.coord=mp[con.name];
con.dir=P(0,0,0);
connectorNum++;
con.ID=connectorNum;
con.coord.type=3;
con.coord.ref=connectorNum;
connectors[connectorNum]=con;
TiXmlElement* pEle;
TiXmlElement* p;
for (pEle = pcon->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement()){
if(strcmp(pEle->Value(), "backshell")==0){
for(p=pEle->FirstChildElement();p;p = p->NextSiblingElement()){
if(strcmp(p->Value(), "termination")==0){
string id=p->Attribute("id");
string name=p->Attribute("name");
pinmap[id]=Pin(name,id,con.coord);
break;
}
}
break;
}
}
for (pEle = pcon->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement()){
if(strcmp(pEle->Value(), "pin")==0){
string id=pEle->Attribute("id");
string name=pEle->Attribute("name");
pinmap[id]=Pin(name,id,con.coord);
}
}
}
void produceWire(TiXmlElement* pwire){
Pin sn,en;
TiXmlElement* pconnection=GetNodePointerByName(pwire,"connection");
if(pconnection!=NULL){
sn=pinmap[pconnection->Attribute("pinref")];
TiXmlElement* pconnection2=GetNextNodePointerByName(pconnection,"connection");
if(pconnection2!=NULL)en=pinmap[pconnection2->Attribute("pinref")];
else en=sn;
}
Wire wire;
wire.sn=sn;
wire.en=en;
wire.name=pwire->Attribute("name");
if(pwire->Attribute("outsidediameter")!=NULL){
wire.diameter=atof(pwire->Attribute("outsidediameter"));
}
else if(pwire->Attribute("wirecsa")!=NULL){
wire.diameter=atof(pwire->Attribute("wirecsa"))*2;
}
else wire.diameter=0.4;
wiremap[wire.name]=wire;
if(sn.coord==P(0,0,0)||en.coord==P(0,0,0)||sn.coord==en.coord)return;
pair<P,P> p=make_pair(sn.coord,en.coord);
pair<P,P> pr=make_pair(en.coord,sn.coord);
if(wire_node.find(p)!=wire_node.end()){
Bund bd=wire_node[p];
bd.wirelist.push_back(wire);
bd.d.push_back(wire.diameter);
wire_node[p]=bd;
}
else if(wire_node.find(pr)!=wire_node.end()){
Bund bd=wire_node[pr];
bd.wirelist.push_back(wire);
bd.d.push_back(wire.diameter);
wire_node[pr]=bd;
}
else {
Bund bd;
bd.start=sn.coord;
bd.goal=en.coord;
bd.wirelist.push_back(wire);
bd.d.push_back(wire.diameter);
wire_node[p]=bd;
}
}
void produce(TiXmlElement* pEle){
if(strcmp(pEle->Value(),"wire")==0)produceWire(pEle);
else produceConnector(pEle);
return;
}
void ProduceNodePointerByName(TiXmlElement* pRootEle, const char* strNodeName)
{
// if equal root node then return
if (0 == strcmp(strNodeName, pRootEle->Value()))
{
produce(pRootEle);
return;
}
TiXmlElement* pEle = pRootEle;
for (pEle = pRootEle->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
{
// recursive find sub node return node pointer
if (0 != strcmp(pEle->Value(), strNodeName))
{
ProduceNodePointerByName(pEle,strNodeName);
}
else {
produce(pEle);
}
}
return;
}
void readxml(const char * xml,const char * connectorFile){
init_readxml();
ifstream infile;
infile.open(connectorFile);//XXXX��csv��·��
string s;
while(getline(infile,s))
{
//cout<<s<<endl;
istringstream sin(s); //�������ַ���line���뵽�ַ�����istringstream��
vector<string> fields; //����һ���ַ�������
string field;
while (getline(sin, field, ',')) //���ַ�����sin�е��ַ����뵽field�ַ����У��Զ���Ϊ�ָ���
{
fields.push_back(field); //���ոն�ȡ���ַ������ӵ�����fields��
}
//cout<<fields[0]<<endl;
//cout<<"read_xml getline"<<endl;
//cout<<fields[0]<<" "<<fields[1]<<" "<<fields[2]<<" "<<fields[3]<<endl;
mp[fields[0]]=P(atof(fields[1].c_str()),atof(fields[2].c_str()),atof(fields[3].c_str()));
}
TiXmlDocument* pDoc = new TiXmlDocument(xml);
if(!(pDoc->LoadFile()))return;
//pDoc->Print();
//���ø�Ԫ�أ���Persons��
//cout<<"connectivity"<<endl<<endl;
TiXmlElement *RootElement = pDoc->RootElement();
TiXmlElement * connectivity=GetNodePointerByName(RootElement, "connectivity");
//cout<<(connectivity->Value())<<endl;
//cout<<(connectivity->Attribute("id")==NULL)<<endl;
ProduceNodePointerByName(connectivity,"connector");
ProduceNodePointerByName(connectivity,"splice");
ProduceNodePointerByName(connectivity,"wire");
for(map< pair<P,P> ,Bund>::iterator it=wire_node.begin();it!=wire_node.end();it++){
wire_pairs.push_back(it->second);
}
for(int i=0;i<wire_pairs.size();i++){
Bund &bd=wire_pairs[i];
for(int j=0;j<bd.d.size();j++){
bd.dia+=(bd.d[j])*(bd.d[j]);
//cout<<bd.d[j]<<" ";
}
bd.dia=sqrt(bd.dia);
for(int j=0;j<bd.wirelist.size();j++){
Wire & wire=bd.wirelist[j];
bd.wirenamelist.push_back(wire.name);
}
}
cout<<"read xml Finish"<<endl;
}