bool SES_DrawWire::addNextNetPoint(Schematic& schematic, const Point& pos) noexcept { Q_ASSERT(mSubState == SubState_PositioningNetPoint); // abort if p2 == p0 (no line drawn) if (pos == mFixedStartAnchor->getPosition()) { abortPositioning(true); return false; } else { bool finishCommand = false; try { // create a new undo command group to make all changes atomic QScopedPointer<UndoCommandGroup> cmdGroup( new UndoCommandGroup("Add schematic netline")); // remove p1 if p1 == p0 || p1 == p2 if ((mPositioningNetPoint1->getPosition() == mFixedStartAnchor->getPosition()) || (mPositioningNetPoint1->getPosition() == mPositioningNetPoint2->getPosition())) { QScopedPointer<CmdSchematicNetSegmentRemoveElements> cmdRemove( new CmdSchematicNetSegmentRemoveElements( mPositioningNetPoint1->getNetSegment())); cmdRemove->removeNetPoint(*mPositioningNetPoint1); cmdRemove->removeNetLine(*mPositioningNetLine1); cmdRemove->removeNetLine(*mPositioningNetLine2); QScopedPointer<CmdSchematicNetSegmentAddElements> cmdAdd( new CmdSchematicNetSegmentAddElements( mPositioningNetPoint1->getNetSegment())); mPositioningNetLine2 = cmdAdd->addNetLine(*mFixedStartAnchor, *mPositioningNetPoint2); mUndoStack.appendToCmdGroup(cmdAdd.take()); mUndoStack.appendToCmdGroup(cmdRemove.take()); } // find anchor under cursor SI_NetLineAnchor* otherAnchor = nullptr; SI_NetSegment* otherNetSegment = nullptr; QString otherForcedNetName; if (SI_NetPoint* netpoint = findNetPoint(schematic, pos, mPositioningNetPoint2)) { otherAnchor = netpoint; otherNetSegment = &netpoint->getNetSegment(); } else if (SI_SymbolPin* pin = findSymbolPin(schematic, pos)) { otherAnchor = pin; otherNetSegment = pin->getNetSegmentOfLines(); // connect pin if needed if (!otherNetSegment) { Q_ASSERT(pin->getComponentSignalInstance()); mUndoStack.appendToCmdGroup(new CmdCompSigInstSetNetSignal( *pin->getComponentSignalInstance(), &mPositioningNetPoint2->getNetSignalOfNetSegment())); otherForcedNetName = pin->getComponentSignalInstance()->getForcedNetSignalName(); } } else if (SI_NetLine* netline = findNetLine(schematic, pos, mPositioningNetLine2)) { // split netline otherNetSegment = &netline->getNetSegment(); QScopedPointer<CmdSchematicNetSegmentAddElements> cmdAdd( new CmdSchematicNetSegmentAddElements(*otherNetSegment)); otherAnchor = cmdAdd->addNetPoint(pos); cmdAdd->addNetLine(*otherAnchor, netline->getStartPoint()); cmdAdd->addNetLine(*otherAnchor, netline->getEndPoint()); mUndoStack.appendToCmdGroup(cmdAdd.take()); // can throw QScopedPointer<CmdSchematicNetSegmentRemoveElements> cmdRemove( new CmdSchematicNetSegmentRemoveElements(*otherNetSegment)); cmdRemove->removeNetLine(*netline); mUndoStack.appendToCmdGroup(cmdRemove.take()); // can throw } // if anchor found under the cursor, replace "mPositioningNetPoint2" with // it if (otherAnchor) { if ((!otherNetSegment) || (otherNetSegment == &mPositioningNetPoint2->getNetSegment())) { QScopedPointer<CmdSchematicNetSegmentAddElements> cmdAdd( new CmdSchematicNetSegmentAddElements( mPositioningNetPoint2->getNetSegment())); cmdAdd->addNetLine(*otherAnchor, mPositioningNetLine2->getStartPoint()); mUndoStack.appendToCmdGroup(cmdAdd.take()); // can throw QScopedPointer<CmdSchematicNetSegmentRemoveElements> cmdRemove( new CmdSchematicNetSegmentRemoveElements( mPositioningNetPoint2->getNetSegment())); cmdRemove->removeNetPoint(*mPositioningNetPoint2); cmdRemove->removeNetLine(*mPositioningNetLine2); mUndoStack.appendToCmdGroup(cmdRemove.take()); // can throw } else { // change net signal if needed NetSignal* thisSignal = &mPositioningNetPoint2->getNetSignalOfNetSegment(); NetSignal* otherSignal = &otherNetSegment->getNetSignal(); if (thisSignal != otherSignal) { NetSignal* resultingNetSignal = nullptr; SI_NetSegment* netSegmentToChangeSignal = nullptr; if (otherNetSegment->getForcedNetNames().count() > 0) { resultingNetSignal = &otherNetSegment->getNetSignal(); netSegmentToChangeSignal = &mPositioningNetPoint2->getNetSegment(); } else if (mPositioningNetPoint2->getNetSegment() .getForcedNetNames() .count() > 0) { resultingNetSignal = &mPositioningNetPoint2->getNetSignalOfNetSegment(); netSegmentToChangeSignal = otherNetSegment; } else if (otherSignal->hasAutoName() && (!thisSignal->hasAutoName())) { resultingNetSignal = &mPositioningNetPoint2->getNetSignalOfNetSegment(); netSegmentToChangeSignal = otherNetSegment; } else { resultingNetSignal = &otherNetSegment->getNetSignal(); netSegmentToChangeSignal = &mPositioningNetPoint2->getNetSegment(); } mUndoStack.appendToCmdGroup( new CmdChangeNetSignalOfSchematicNetSegment( *netSegmentToChangeSignal, *resultingNetSignal)); } // combine both net segments mUndoStack.appendToCmdGroup(new CmdCombineSchematicNetSegments( mPositioningNetPoint2->getNetSegment(), *mPositioningNetPoint2, *otherNetSegment, *otherAnchor)); } if (!otherForcedNetName.isEmpty()) { // change net name if connected to a pin with forced net name try { CircuitIdentifier name = CircuitIdentifier(otherForcedNetName); // can throw NetSignal* signal = schematic.getProject().getCircuit().getNetSignalByName(*name); if (signal) { mUndoStack.appendToCmdGroup( new CmdChangeNetSignalOfSchematicNetSegment( mPositioningNetPoint2->getNetSegment(), *signal)); } else { QScopedPointer<CmdNetSignalEdit> cmd(new CmdNetSignalEdit( schematic.getProject().getCircuit(), mPositioningNetPoint2->getNetSignalOfNetSegment())); cmd->setName(name, false); mUndoStack.appendToCmdGroup(cmd.take()); } } catch (const Exception& e) { QMessageBox::warning( &mEditor, tr("Invalid net name"), QString( tr("Could not apply the forced net name because '%1' is " "not a valid net name.")) .arg(otherForcedNetName)); } } finishCommand = true; } else { finishCommand = false; } } catch (const UserCanceled& e) { return false; } catch (const Exception& e) { QMessageBox::critical(&mEditor, tr("Error"), e.getMsg()); return false; } try { // finish the current command mUndoStack.commitCmdGroup(); mSubState = SubState_Idle; // abort or start a new command if (finishCommand) { mUndoStack.beginCmdGroup(QString()); // this is ugly! abortPositioning(true); return false; } else { return startPositioning(schematic, pos, mPositioningNetPoint2); } } catch (const Exception& e) { QMessageBox::critical(&mEditor, tr("Error"), e.getMsg()); if (mSubState != SubState_Idle) { abortPositioning(false); } return false; } } }
bool DoScript( CClientSession* pSession, istream& ifscript ) { char buf[_MAX_LINE]; while( !ifscript.eof() ){ ifscript.getline( buf, ELEMENTS(buf) ); if( ifscript.fail() )break; trimleft( buf ); if( buf[0]=='\0' || strncmp(buf, "//", 2)==0 )continue; //skip comments char* pcmd = buf; char* pval = buf; while( *pval && !isspace(*pval) )pval++; if( *pval!='\0' ){ *pval++ = '\0'; } trimright( pcmd ); strlwr( pcmd ); trimleft( pval ); if( strcmp( pcmd, "put" )==0 ){ cmdPutFiles( pSession, pval ); }else if( strcmp( pcmd, "get" )==0 ){ cmdGetFiles( pSession, pval ); }else if( strcmp( pcmd, "rm" )==0 ){ cmdRemove( pSession, pval ); }else if( strcmp( pcmd, "chmod" )==0 ){ cmdChMod( pSession, pval ); }else if( strcmp( pcmd, "run" )==0 ){ cmdRunImage( pSession, pval ); }else if( strcmp( pcmd, "mkdir" )==0 ){ cmdMkDir( pSession, pval ); }else if( strcmp( pcmd, "cd" )==0 ){ cmdChDir( pSession, pval ); }else if( strcmp( pcmd, "rmdir" )==0 ){ cmdRmDir( pSession, pval ); }else if( strcmp( pcmd, "ls" )==0 ){ cmdListDir( pSession, pval ); }else if( strcmp( pcmd, "ln" )==0 ){ cmdSoftLink( pSession, pval ); }else if( strcmp( pcmd, "info" )==0 ){ cmdSysInfo( pSession ); }else if( strcmp( pcmd, "fmode" )==0 ){ cmdFileMode( pSession, pval ); }else if( strcmp( pcmd, "clrdir" )==0 ){ cmdClearDir( pSession, pval ); }else if( strcmp( pcmd, "sys" )==0 ){ // cmdSystem( pval ); }else if( strcmp( pcmd, "kill" )==0 ){ // cmdKillProcs( pSession ); }else if( strcmp( pcmd, "idle" )==0 ){ // cmdSetIdle( pSession, pval ); }else if( strcmp( pcmd, "end" )==0 ){ break; }else if( strcmp( pcmd, "shutdown" )==0 ){ cmdShutdown( pSession, pval ); }else{ cout<<"unknownd command."<<endl; } } return true; }
bool SES_DrawWire::startPositioning(Schematic& schematic, const Point& pos, SI_NetPoint* fixedPoint) noexcept { try { // start a new undo command Q_ASSERT(mSubState == SubState_Idle); mUndoStack.beginCmdGroup(tr("Draw Wire")); mSubState = SubState_PositioningNetPoint; // determine the fixed anchor (create one if it doesn't exist already) NetSignal* netsignal = nullptr; SI_NetSegment* netsegment = nullptr; tl::optional<CircuitIdentifier> forcedNetName; if (fixedPoint) { mFixedStartAnchor = fixedPoint; netsegment = &fixedPoint->getNetSegment(); } else if (SI_NetPoint* netpoint = findNetPoint(schematic, pos)) { mFixedStartAnchor = netpoint; netsegment = &netpoint->getNetSegment(); } else if (SI_SymbolPin* pin = findSymbolPin(schematic, pos)) { mFixedStartAnchor = pin; netsegment = pin->getNetSegmentOfLines(); netsignal = pin->getCompSigInstNetSignal(); if (pin->getComponentSignalInstance()) { QString name = pin->getComponentSignalInstance()->getForcedNetSignalName(); try { if (!name.isEmpty()) forcedNetName = CircuitIdentifier(name); // can throw } catch (const Exception& e) { QMessageBox::warning( &mEditor, tr("Invalid net name"), QString(tr("Could not apply the forced net name because '%1' is " "not a valid net name.")) .arg(name)); } } } else if (SI_NetLine* netline = findNetLine(schematic, pos)) { // split netline netsegment = &netline->getNetSegment(); QScopedPointer<CmdSchematicNetSegmentAddElements> cmdAdd( new CmdSchematicNetSegmentAddElements(*netsegment)); mFixedStartAnchor = cmdAdd->addNetPoint(pos); cmdAdd->addNetLine(*mFixedStartAnchor, netline->getStartPoint()); cmdAdd->addNetLine(*mFixedStartAnchor, netline->getEndPoint()); mUndoStack.appendToCmdGroup(cmdAdd.take()); // can throw QScopedPointer<CmdSchematicNetSegmentRemoveElements> cmdRemove( new CmdSchematicNetSegmentRemoveElements(*netsegment)); cmdRemove->removeNetLine(*netline); mUndoStack.appendToCmdGroup(cmdRemove.take()); // can throw } // find netsignal if name is given if (forcedNetName) { netsignal = mCircuit.getNetSignalByName(**forcedNetName); } // create new netsignal if none found if ((!netsegment) && (!netsignal)) { // get or add netclass with the name "default" NetClass* netclass = mCircuit.getNetClassByName(ElementName("default")); if (!netclass) { CmdNetClassAdd* cmd = new CmdNetClassAdd(mCircuit, ElementName("default")); mUndoStack.appendToCmdGroup(cmd); // can throw netclass = cmd->getNetClass(); Q_ASSERT(netclass); } // add new netsignal CmdNetSignalAdd* cmd = new CmdNetSignalAdd(mCircuit, *netclass, forcedNetName); mUndoStack.appendToCmdGroup(cmd); // can throw netsignal = cmd->getNetSignal(); Q_ASSERT(netsignal); } // create new netsegment if none found if (!netsegment) { // connect pin if needed if (SI_SymbolPin* pin = dynamic_cast<SI_SymbolPin*>(mFixedStartAnchor)) { Q_ASSERT(pin->getComponentSignalInstance()); mUndoStack.appendToCmdGroup(new CmdCompSigInstSetNetSignal( *pin->getComponentSignalInstance(), netsignal)); } // add net segment Q_ASSERT(netsignal); CmdSchematicNetSegmentAdd* cmd = new CmdSchematicNetSegmentAdd(schematic, *netsignal); mUndoStack.appendToCmdGroup(cmd); // can throw netsegment = cmd->getNetSegment(); } // add netpoint if none found Q_ASSERT(netsegment); CmdSchematicNetSegmentAddElements* cmd = new CmdSchematicNetSegmentAddElements(*netsegment); if (!mFixedStartAnchor) { mFixedStartAnchor = cmd->addNetPoint(pos); } Q_ASSERT(mFixedStartAnchor); // add more netpoints & netlines SI_NetPoint* p2 = cmd->addNetPoint(pos); Q_ASSERT(p2); // second netpoint SI_NetLine* l1 = cmd->addNetLine(*mFixedStartAnchor, *p2); Q_ASSERT(l1); // first netline SI_NetPoint* p3 = cmd->addNetPoint(pos); Q_ASSERT(p3); // third netpoint SI_NetLine* l2 = cmd->addNetLine(*p2, *p3); Q_ASSERT(l2); // second netline mUndoStack.appendToCmdGroup(cmd); // can throw // update members mPositioningNetPoint1 = p2; mPositioningNetLine1 = l1; mPositioningNetPoint2 = p3; mPositioningNetLine2 = l2; // properly place the new netpoints/netlines according the current wire mode updateNetpointPositions(pos); // highlight all elements of the current netsignal mCircuit.setHighlightedNetSignal(&netsegment->getNetSignal()); return true; } catch (const Exception& e) { QMessageBox::critical(&mEditor, tr("Error"), e.getMsg()); if (mSubState != SubState_Idle) { abortPositioning(false); } return false; } }