mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 04:19:19 +02:00
partial initial refactoring: events, memcells, tracks, models, traction; NOTE: debug mode broken, investigate
This commit is contained in:
389
Traction.cpp
389
Traction.cpp
@@ -90,8 +90,91 @@ jawnie nazwę sekcji, ewentualnie nazwę zasilacza (zostanie zastąpiona wskazan
|
||||
sekcji z sąsiedniego przęsła).
|
||||
*/
|
||||
|
||||
TTraction::TTraction( scene::node_data const &Nodedata ) : basic_node( Nodedata ) {}
|
||||
|
||||
// legacy constructor
|
||||
TTraction::TTraction( std::string Name ) {
|
||||
|
||||
m_name = Name;
|
||||
}
|
||||
|
||||
glm::dvec3 LoadPoint( cParser &Input ) {
|
||||
// pobranie współrzędnych punktu
|
||||
glm::dvec3 point;
|
||||
Input.getTokens( 3 );
|
||||
Input
|
||||
>> point.x
|
||||
>> point.y
|
||||
>> point.z;
|
||||
return point;
|
||||
}
|
||||
|
||||
void
|
||||
TTraction::Load( cParser *parser, glm::dvec3 const &pOrigin ) {
|
||||
|
||||
parser->getTokens( 4 );
|
||||
*parser
|
||||
>> asPowerSupplyName
|
||||
>> NominalVoltage
|
||||
>> MaxCurrent
|
||||
>> fResistivity;
|
||||
if( fResistivity == 0.01f ) {
|
||||
// tyle jest w sceneriach [om/km]
|
||||
// taka sensowniejsza wartość za http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
|
||||
fResistivity = 0.075f;
|
||||
}
|
||||
fResistivity *= 0.001f; // teraz [om/m]
|
||||
// Ra 2014-02: a tutaj damy symbol sieci i jej budowę, np.:
|
||||
// SKB70-C, CuCd70-2C, KB95-2C, C95-C, C95-2C, YC95-2C, YpC95-2C, YC120-2C
|
||||
// YpC120-2C, YzC120-2C, YwsC120-2C, YC150-C150, YC150-2C150, C150-C150
|
||||
// C120-2C, 2C120-2C, 2C120-2C-1, 2C120-2C-2, 2C120-2C-3, 2C120-2C-4
|
||||
auto const material = parser->getToken<std::string>();
|
||||
// 1=miedziana, rysuje się na zielono albo czerwono
|
||||
// 2=aluminiowa, rysuje się na czarno
|
||||
if( material == "none" ) { Material = 0; }
|
||||
else if( material == "al" ) { Material = 2; }
|
||||
else { Material = 1; }
|
||||
parser->getTokens( 2 );
|
||||
*parser
|
||||
>> WireThickness
|
||||
>> DamageFlag;
|
||||
pPoint1 = LoadPoint( *parser ) + pOrigin;
|
||||
pPoint2 = LoadPoint( *parser ) + pOrigin;
|
||||
pPoint3 = LoadPoint( *parser ) + pOrigin;
|
||||
pPoint4 = LoadPoint( *parser ) + pOrigin;
|
||||
auto const minheight { parser->getToken<double>() };
|
||||
fHeightDifference = ( pPoint3.y - pPoint1.y + pPoint4.y - pPoint2.y ) * 0.5 - minheight;
|
||||
auto const segmentlength { parser->getToken<double>() };
|
||||
iNumSections = (
|
||||
segmentlength ?
|
||||
glm::length( ( pPoint1 - pPoint2 ) ) / segmentlength :
|
||||
0 );
|
||||
parser->getTokens( 2 );
|
||||
*parser
|
||||
>> Wires
|
||||
>> WireOffset;
|
||||
m_visible = ( parser->getToken<std::string>() == "vis" );
|
||||
|
||||
std::string token { parser->getToken<std::string>() };
|
||||
if( token == "parallel" ) {
|
||||
// jawne wskazanie innego przęsła, na które może przestawić się pantograf
|
||||
parser->getTokens();
|
||||
*parser >> asParallel;
|
||||
}
|
||||
while( ( false == token.empty() )
|
||||
&& ( token != "endtraction" ) ) {
|
||||
|
||||
token = parser->getToken<std::string>();
|
||||
}
|
||||
|
||||
Init(); // przeliczenie parametrów
|
||||
|
||||
// calculate traction location
|
||||
m_location = interpolate( pPoint2, pPoint1, 0.5 );
|
||||
}
|
||||
|
||||
std::size_t
|
||||
TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &Origin ) {
|
||||
TTraction::create_geometry( geometrybank_handle const &Bank ) {
|
||||
|
||||
if( m_geometry != null_handle ) {
|
||||
return GfxRenderer.Vertices( m_geometry ).size() / 2;
|
||||
@@ -106,14 +189,14 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
basic_vertex startvertex, endvertex;
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pPoint1.x - ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - Origin.x,
|
||||
pPoint1.y - Origin.y,
|
||||
pPoint1.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - Origin.z );
|
||||
pPoint1.x - ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - m_origin.x,
|
||||
pPoint1.y - m_origin.y,
|
||||
pPoint1.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - m_origin.z );
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pPoint2.x - ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - Origin.x,
|
||||
pPoint2.y - Origin.y,
|
||||
pPoint2.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - Origin.z );
|
||||
pPoint2.x - ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - m_origin.x,
|
||||
pPoint2.y - m_origin.y,
|
||||
pPoint2.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
// Nie wiem co 'Marcin
|
||||
@@ -130,9 +213,9 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
if( Wires > 1 ) { // lina nośna w kawałkach
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pPoint3.x - Origin.x,
|
||||
pPoint3.y - Origin.y,
|
||||
pPoint3.z - Origin.z );
|
||||
pPoint3.x - m_origin.x,
|
||||
pPoint3.y - m_origin.y,
|
||||
pPoint3.z - m_origin.z );
|
||||
for( int i = 0; i < iNumSections - 1; ++i ) {
|
||||
pt3 = pPoint3 + v1 * f;
|
||||
t = ( 1 - std::fabs( f - mid ) * 2 );
|
||||
@@ -141,9 +224,9 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
&& ( i != iNumSections - 2 ) ) ) {
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pt3.x - Origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - Origin.y,
|
||||
pt3.z - Origin.z );
|
||||
pt3.x - m_origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - m_origin.y,
|
||||
pt3.z - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
startvertex = endvertex;
|
||||
@@ -152,9 +235,9 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
}
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pPoint4.x - Origin.x,
|
||||
pPoint4.y - Origin.y,
|
||||
pPoint4.z - Origin.z );
|
||||
pPoint4.x - m_origin.x,
|
||||
pPoint4.y - m_origin.y,
|
||||
pPoint4.z - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
}
|
||||
@@ -162,14 +245,14 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
if( Wires > 2 ) {
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pPoint1.x + ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - Origin.x,
|
||||
pPoint1.y - Origin.y,
|
||||
pPoint1.z + ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - Origin.z );
|
||||
pPoint1.x + ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - m_origin.x,
|
||||
pPoint1.y - m_origin.y,
|
||||
pPoint1.z + ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - m_origin.z );
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pPoint2.x + ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - Origin.x,
|
||||
pPoint2.y - Origin.y,
|
||||
pPoint2.z + ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - Origin.z );
|
||||
pPoint2.x + ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - m_origin.x,
|
||||
pPoint2.y - m_origin.y,
|
||||
pPoint2.z + ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
}
|
||||
@@ -179,22 +262,22 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
if( Wires == 4 ) {
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pPoint3.x - Origin.x,
|
||||
pPoint3.y - 0.65f * fHeightDifference - Origin.y,
|
||||
pPoint3.z - Origin.z );
|
||||
pPoint3.x - m_origin.x,
|
||||
pPoint3.y - 0.65f * fHeightDifference - m_origin.y,
|
||||
pPoint3.z - m_origin.z );
|
||||
for( int i = 0; i < iNumSections - 1; ++i ) {
|
||||
pt3 = pPoint3 + v1 * f;
|
||||
t = ( 1 - std::fabs( f - mid ) * 2 );
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pt3.x - Origin.x,
|
||||
pt3.x - m_origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - (
|
||||
( ( i == 0 )
|
||||
|| ( i == iNumSections - 2 ) ) ?
|
||||
0.25f * fHeightDifference :
|
||||
0.05 )
|
||||
- Origin.y,
|
||||
pt3.z - Origin.z );
|
||||
- m_origin.y,
|
||||
pt3.z - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
startvertex = endvertex;
|
||||
@@ -202,9 +285,9 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
}
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pPoint4.x - Origin.x,
|
||||
pPoint4.y - 0.65f * fHeightDifference - Origin.y,
|
||||
pPoint4.z - Origin.z );
|
||||
pPoint4.x - m_origin.x,
|
||||
pPoint4.y - 0.65f * fHeightDifference - m_origin.y,
|
||||
pPoint4.z - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
}
|
||||
@@ -223,28 +306,28 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
if( ( i % 2 ) == 0 ) {
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pt3.x - Origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - ( ( i == 0 ) || ( i == iNumSections - 2 ) ? flo : flo1 ) - Origin.y,
|
||||
pt3.z - Origin.z );
|
||||
pt3.x - m_origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - ( ( i == 0 ) || ( i == iNumSections - 2 ) ? flo : flo1 ) - m_origin.y,
|
||||
pt3.z - m_origin.z );
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pt4.x - ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - Origin.x,
|
||||
pt4.y - Origin.y,
|
||||
pt4.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - Origin.z );
|
||||
pt4.x - ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - m_origin.x,
|
||||
pt4.y - m_origin.y,
|
||||
pt4.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
}
|
||||
else {
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pt3.x - Origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - ( ( i == 0 ) || ( i == iNumSections - 2 ) ? flo : flo1 ) - Origin.y,
|
||||
pt3.z - Origin.z );
|
||||
pt3.x - m_origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - ( ( i == 0 ) || ( i == iNumSections - 2 ) ? flo : flo1 ) - m_origin.y,
|
||||
pt3.z - m_origin.z );
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pt4.x + ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - Origin.x,
|
||||
pt4.y - Origin.y,
|
||||
pt4.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - Origin.z );
|
||||
pt4.x + ( pPoint2.z / ddp - pPoint1.z / ddp ) * WireOffset - m_origin.x,
|
||||
pt4.y - m_origin.y,
|
||||
pt4.z - ( -pPoint2.x / ddp + pPoint1.x / ddp ) * WireOffset - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
}
|
||||
@@ -253,14 +336,14 @@ TTraction::create_geometry( geometrybank_handle const &Bank, glm::dvec3 const &O
|
||||
|| ( i == iNumSections - 3 ) ) ) ) {
|
||||
startvertex.position =
|
||||
glm::vec3(
|
||||
pt3.x - Origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - 0.05 - Origin.y,
|
||||
pt3.z - Origin.z );
|
||||
pt3.x - m_origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - 0.05 - m_origin.y,
|
||||
pt3.z - m_origin.z );
|
||||
endvertex.position =
|
||||
glm::vec3(
|
||||
pt3.x - Origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - Origin.y,
|
||||
pt3.z - Origin.z );
|
||||
pt3.x - m_origin.x,
|
||||
pt3.y - std::sqrt( t ) * fHeightDifference - m_origin.y,
|
||||
pt3.z - m_origin.z );
|
||||
vertices.emplace_back( startvertex );
|
||||
vertices.emplace_back( endvertex );
|
||||
}
|
||||
@@ -523,3 +606,211 @@ TTraction::wire_color() const {
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// legacy method, initializes traction after deserialization from scenario file
|
||||
void
|
||||
traction_table::InitTraction() {
|
||||
/*
|
||||
//łączenie drutów ze sobą oraz z torami i eventami
|
||||
// TGroundNode *nCurrent, *nTemp;
|
||||
// TTraction *tmp; // znalezione przęsło
|
||||
int iConnection;
|
||||
std::string name;
|
||||
for( auto *traction : m_items ) {
|
||||
// podłączenie do zasilacza, żeby można było sumować prąd kilku pojazdów
|
||||
// a jednocześnie z jednego miejsca zmieniać napięcie eventem
|
||||
// wykonywane najpierw, żeby można było logować podłączenie 2 zasilaczy do jednego drutu
|
||||
// izolator zawieszony na przęśle jest ma być osobnym odcinkiem drutu o długości ok. 1m,
|
||||
// podłączonym do zasilacza o nazwie "*" (gwiazka); "none" nie będzie odpowiednie
|
||||
nTemp = FindGroundNode(traction->asPowerSupplyName, TP_TRACTIONPOWERSOURCE);
|
||||
if (nTemp) // jak zasilacz znaleziony
|
||||
traction->PowerSet(nTemp->psTractionPowerSource); // to podłączyć do przęsła
|
||||
else if (traction->asPowerSupplyName != "*") // gwiazdka dla przęsła z izolatorem
|
||||
if (traction->asPowerSupplyName != "none") // dopuszczamy na razie brak podłączenia?
|
||||
{ // logowanie błędu i utworzenie zasilacza o domyślnej zawartości
|
||||
ErrorLog("Missed TractionPowerSource: " + traction->asPowerSupplyName);
|
||||
nTemp = new TGroundNode();
|
||||
nTemp->iType = TP_TRACTIONPOWERSOURCE;
|
||||
nTemp->asName = traction->asPowerSupplyName;
|
||||
nTemp->psTractionPowerSource = new TTractionPowerSource(nTemp);
|
||||
nTemp->psTractionPowerSource->Init(traction->NominalVoltage, traction->MaxCurrent);
|
||||
nTemp->nNext = nRootOfType[nTemp->iType]; // ostatni dodany dołączamy na końcu
|
||||
// nowego
|
||||
nRootOfType[nTemp->iType] = nTemp; // ustawienie nowego na początku listy
|
||||
}
|
||||
}
|
||||
|
||||
for( auto *traction : m_items ) {
|
||||
|
||||
if (!traction->hvNext[0]) // tylko jeśli jeszcze nie podłączony
|
||||
{
|
||||
tmp = FindTraction(traction->pPoint1, iConnection, nCurrent);
|
||||
switch (iConnection)
|
||||
{
|
||||
case 0:
|
||||
traction->Connect(0, tmp, 0);
|
||||
break;
|
||||
case 1:
|
||||
traction->Connect(0, tmp, 1);
|
||||
break;
|
||||
}
|
||||
if (traction->hvNext[0]) // jeśli został podłączony
|
||||
if (traction->psSection && tmp->psSection) // tylko przęsło z izolatorem może nie
|
||||
// mieć zasilania, bo ma 2, trzeba
|
||||
// sprawdzać sąsiednie
|
||||
if (traction->psSection !=
|
||||
tmp->psSection) // połączone odcinki mają różne zasilacze
|
||||
{ // to może być albo podłączenie podstacji lub kabiny sekcyjnej do sekcji, albo
|
||||
// błąd
|
||||
if (traction->psSection->bSection && !tmp->psSection->bSection)
|
||||
{ //(tmp->psSection) jest podstacją, a (Traction->psSection) nazwą sekcji
|
||||
tmp->PowerSet(traction->psSection); // zastąpienie wskazaniem sekcji
|
||||
}
|
||||
else if (!traction->psSection->bSection && tmp->psSection->bSection)
|
||||
{ //(Traction->psSection) jest podstacją, a (tmp->psSection) nazwą sekcji
|
||||
traction->PowerSet(tmp->psSection); // zastąpienie wskazaniem sekcji
|
||||
}
|
||||
else // jeśli obie to sekcje albo obie podstacje, to będzie błąd
|
||||
ErrorLog("Bad power: at " +
|
||||
to_string(traction->pPoint1.x, 2, 6) + " " +
|
||||
to_string(traction->pPoint1.y, 2, 6) + " " +
|
||||
to_string(traction->pPoint1.z, 2, 6));
|
||||
}
|
||||
}
|
||||
if (!traction->hvNext[1]) // tylko jeśli jeszcze nie podłączony
|
||||
{
|
||||
tmp = FindTraction(traction->pPoint2, iConnection, nCurrent);
|
||||
switch (iConnection)
|
||||
{
|
||||
case 0:
|
||||
traction->Connect(1, tmp, 0);
|
||||
break;
|
||||
case 1:
|
||||
traction->Connect(1, tmp, 1);
|
||||
break;
|
||||
}
|
||||
if (traction->hvNext[1]) // jeśli został podłączony
|
||||
if (traction->psSection && tmp->psSection) // tylko przęsło z izolatorem może nie
|
||||
// mieć zasilania, bo ma 2, trzeba
|
||||
// sprawdzać sąsiednie
|
||||
if (traction->psSection != tmp->psSection)
|
||||
{ // to może być albo podłączenie podstacji lub kabiny sekcyjnej do sekcji, albo
|
||||
// błąd
|
||||
if (traction->psSection->bSection && !tmp->psSection->bSection)
|
||||
{ //(tmp->psSection) jest podstacją, a (Traction->psSection) nazwą sekcji
|
||||
tmp->PowerSet(traction->psSection); // zastąpienie wskazaniem sekcji
|
||||
}
|
||||
else if (!traction->psSection->bSection && tmp->psSection->bSection)
|
||||
{ //(Traction->psSection) jest podstacją, a (tmp->psSection) nazwą sekcji
|
||||
traction->PowerSet(tmp->psSection); // zastąpienie wskazaniem sekcji
|
||||
}
|
||||
else // jeśli obie to sekcje albo obie podstacje, to będzie błąd
|
||||
ErrorLog("Bad power: at " +
|
||||
to_string(traction->pPoint2.x, 2, 6) + " " +
|
||||
to_string(traction->pPoint2.y, 2, 6) + " " +
|
||||
to_string(traction->pPoint2.z, 2, 6));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
iConnection = 0; // teraz będzie licznikiem końców
|
||||
for( auto *traction : m_items ) {
|
||||
// operacje mające na celu wykrywanie bieżni wspólnych i łączenie przęseł naprążania
|
||||
if (traction->WhereIs()) // oznakowanie przedostatnich przęseł
|
||||
{ // poszukiwanie bieżni wspólnej dla przedostatnich przęseł, również w celu połączenia
|
||||
// zasilania
|
||||
// to się nie sprawdza, bo połączyć się mogą dwa niezasilane odcinki jako najbliższe
|
||||
// sobie
|
||||
// nCurrent->hvTraction->hvParallel=TractionNearestFind(nCurrent->pCenter,0,nCurrent);
|
||||
// //szukanie najbliższego przęsła
|
||||
// trzeba by zliczać końce, a potem wpisać je do tablicy, aby sukcesywnie podłączać do
|
||||
// zasilaczy
|
||||
traction->iTries = 5; // oznaczanie końcowych
|
||||
++iConnection;
|
||||
}
|
||||
if (traction->fResistance[0] == 0.0)
|
||||
{
|
||||
traction->ResistanceCalc(); // obliczanie przęseł w segmencie z bezpośrednim zasilaniem
|
||||
// ErrorLog("Section "+nCurrent->hvTraction->asPowerSupplyName+" connected"); //jako
|
||||
// niby błąd będzie bardziej widoczne
|
||||
traction->iTries = 0; // nie potrzeba mu szukać zasilania
|
||||
}
|
||||
// if (!Traction->hvParallel) //jeszcze utworzyć pętle z bieżni wspólnych
|
||||
}
|
||||
int zg = 0; // zgodność kierunku przęseł, tymczasowo iterator do tabeli końców
|
||||
// końców jest ok. 10 razy mniej niż wszystkich przęseł (Quark: 216)
|
||||
TGroundNode **nEnds = new TGroundNode *[iConnection];
|
||||
for( auto *traction : m_items ) {
|
||||
//łączenie bieżni wspólnych, w tym oznaczanie niepodanych jawnie
|
||||
if (!traction->asParallel.empty()) // będzie wskaźnik na inne przęsło
|
||||
if( ( traction->asParallel == "none" )
|
||||
|| ( traction->asParallel == "*" ) ) {
|
||||
// jeśli nieokreślone
|
||||
traction->iLast = 2; // jakby przedostatni - niech po prostu szuka (iLast już przeliczone)
|
||||
}
|
||||
else if (!traction->hvParallel) // jeśli jeszcze nie został włączony w kółko
|
||||
{
|
||||
auto *nTemp = find( traction->asParallel );
|
||||
if (nTemp)
|
||||
{ // o ile zostanie znalezione przęsło o takiej nazwie
|
||||
if (!nTemp->hvParallel) // jeśli tamten jeszcze nie ma wskaźnika bieżni wspólnej
|
||||
traction->hvParallel = nTemp; // wpisać siebie i dalej dać mu wskaźnik zwrotny
|
||||
else // a jak ma, to albo dołączyć się do kółeczka
|
||||
traction->hvParallel = nTemp->hvParallel; // przjąć dotychczasowy wskaźnik od niego
|
||||
nTemp->hvParallel = traction; // i na koniec ustawienie wskaźnika zwrotnego
|
||||
}
|
||||
if (!traction->hvParallel)
|
||||
ErrorLog("Missed overhead: " + traction->asParallel); // logowanie braku
|
||||
}
|
||||
if (traction->iTries > 0) // jeśli zaznaczony do podłączenia
|
||||
// if (!nCurrent->hvTraction->psPower[0]||!nCurrent->hvTraction->psPower[1])
|
||||
if (zg < iConnection) // zabezpieczenie
|
||||
nEnds[zg++] = nCurrent; // wypełnianie tabeli końców w celu szukania im połączeń
|
||||
}
|
||||
while( zg < iConnection ) {
|
||||
// zapełnienie do końca tablicy, jeśli by jakieś końce wypadły
|
||||
nEnds[ zg++ ] = nullptr;
|
||||
}
|
||||
zg = 1; // nieefektywny przebieg kończy łączenie
|
||||
while (zg)
|
||||
{ // ustalenie zastępczej rezystancji dla każdego przęsła
|
||||
zg = 0; // flaga podłączonych przęseł końcowych: -1=puste wskaźniki, 0=coś zostało,
|
||||
// 1=wykonano łączenie
|
||||
for (int i = 0; i < iConnection; ++i)
|
||||
if (nEnds[i]) // załatwione będziemy zerować
|
||||
{ // każdy przebieg to próba podłączenia końca segmentu naprężania do innego zasilanego
|
||||
// przęsła
|
||||
if (nEnds[i]->hvTraction->hvNext[0])
|
||||
{ // jeśli końcowy ma ciąg dalszy od strony 0 (Point1), szukamy odcinka najbliższego
|
||||
// do Point2
|
||||
if (TractionNearestFind(nEnds[i]->hvTraction->pPoint2, 0,
|
||||
nEnds[i])) // poszukiwanie przęsła
|
||||
{
|
||||
nEnds[i] = NULL;
|
||||
zg = 1; // jak coś zostało podłączone, to może zasilanie gdzieś dodatkowo
|
||||
// dotrze
|
||||
}
|
||||
}
|
||||
else if (nEnds[i]->hvTraction->hvNext[1])
|
||||
{ // jeśli końcowy ma ciąg dalszy od strony 1 (Point2), szukamy odcinka najbliższego
|
||||
// do Point1
|
||||
if (TractionNearestFind(nEnds[i]->hvTraction->pPoint1, 1,
|
||||
nEnds[i])) // poszukiwanie przęsła
|
||||
{
|
||||
nEnds[i] = NULL;
|
||||
zg = 1; // jak coś zostało podłączone, to może zasilanie gdzieś dodatkowo
|
||||
// dotrze
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // gdy koniec jest samotny, to na razie nie zostanie podłączony (nie powinno
|
||||
// takich być)
|
||||
nEnds[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
delete[] nEnds; // nie potrzebne już
|
||||
*/
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user