int main(int _argc, char** _argv) { //DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME); #if BX_CONFIG_CRT_FILE_READER_WRITER s_fileReader = new bx::CrtFileReader; s_fileWriter = new bx::CrtFileWriter; #endif // BX_CONFIG_CRT_FILE_READER_WRITER cmdAdd("mouselock", cmdMouseLock); cmdAdd("graphics", cmdGraphics ); cmdAdd("exit", cmdExit ); inputAddBindings("bindings", s_bindings); entry::WindowHandle defaultWindow = { 0 }; entry::setWindowTitle(defaultWindow, bx::baseName(_argv[0])); int32_t result = ::_main_(_argc, _argv); #if BX_CONFIG_CRT_FILE_READER_WRITER delete s_fileReader; s_fileReader = NULL; delete s_fileWriter; s_fileWriter = NULL; #endif // BX_CONFIG_CRT_FILE_READER_WRITER return result; }
Camera() { reset(); entry::MouseState mouseState; update(0.0f, mouseState); cmdAdd("move", cmdMove); inputAddBindings("camBindings", s_camBindings); }
int _main_(int _argc, char** _argv) { bx::CommandLine cmdLine(_argc, _argv); if (cmdLine.hasArg('h', "help") ) { help(); return EXIT_FAILURE; } else if (cmdLine.hasArg("associate") ) { associate(); return EXIT_FAILURE; } uint32_t width = 1280; uint32_t height = 720; uint32_t debug = BGFX_DEBUG_TEXT; uint32_t reset = BGFX_RESET_VSYNC; inputAddBindings(s_bindingName[Binding::App], s_binding[Binding::App]); inputAddBindings(s_bindingName[Binding::View], s_binding[Binding::View]); View view; cmdAdd("view", cmdView, &view); bgfx::init(); bgfx::reset(width, height, reset); // Set view 0 clear state. bgfx::setViewClear(0 , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH , 0x101010ff , 1.0f , 0 ); imguiCreate(); PosUvColorVertex::init(); bgfx::RendererType::Enum type = bgfx::getRendererType(); bgfx::ShaderHandle vsTexture = bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_texture"); bgfx::ShaderHandle fsTexture = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_texture"); bgfx::ShaderHandle fsTextureArray = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_texture_array"); bgfx::ProgramHandle textureProgram = bgfx::createProgram( vsTexture , fsTexture , true ); bgfx::ProgramHandle textureArrayProgram = bgfx::createProgram( vsTexture , bgfx::isValid(fsTextureArray) ? fsTextureArray : fsTexture , true ); bgfx::ProgramHandle textureCubeProgram = bgfx::createProgram( bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_texture_cube") , bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_texture_cube") , true ); bgfx::ProgramHandle textureSDFProgram = bgfx::createProgram( vsTexture , bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_texture_sdf") , true); bgfx::UniformHandle s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1); bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4); bgfx::UniformHandle u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4); float speed = 0.37f; float time = 0.0f; Interpolator mip(0.0f); Interpolator layer(0.0f); Interpolator zoom(1.0f); Interpolator scale(1.0f); const char* filePath = _argc < 2 ? "" : _argv[1]; bool directory = false; bx::FileInfo fi; bx::stat(filePath, fi); directory = bx::FileInfo::Directory == fi.m_type; std::string path = filePath; if (!directory) { const char* fileName = directory ? filePath : bx::baseName(filePath); path.assign(filePath, fileName); view.updateFileList(path.c_str(), fileName); } else { view.updateFileList(path.c_str() ); } int exitcode = EXIT_SUCCESS; bgfx::TextureHandle texture = BGFX_INVALID_HANDLE; if (view.m_fileList.empty() ) { exitcode = EXIT_FAILURE; if (2 > _argc) { help("File path is not specified."); } else { fprintf(stderr, "Unable to load '%s' texture.\n", filePath); } } else { uint32_t fileIndex = 0; entry::MouseState mouseState; while (!entry::processEvents(width, height, debug, reset, &mouseState) ) { imguiBeginFrame(mouseState.m_mx , mouseState.m_my , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) | (mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0) , mouseState.m_mz , width , height ); static bool help = false; if (help == false && help != view.m_help) { ImGui::OpenPopup("Help"); } if (ImGui::BeginPopupModal("Help", NULL, ImGuiWindowFlags_AlwaysAutoResize) ) { ImGui::SetWindowFontScale(1.0f); ImGui::Text( "texturev, bgfx texture viewer tool " ICON_KI_WRENCH "\n" "Copyright 2011-2017 Branimir Karadzic. All rights reserved.\n" "License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause\n" ); ImGui::Separator(); ImGui::NextLine(); ImGui::Text("Key bindings:\n\n"); ImGui::PushFont(ImGui::Font::Mono); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "ESC"); ImGui::SameLine(64); ImGui::Text("Exit."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "h"); ImGui::SameLine(64); ImGui::Text("Toggle help screen."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "f"); ImGui::SameLine(64); ImGui::Text("Toggle full-screen."); ImGui::NextLine(); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "-"); ImGui::SameLine(64); ImGui::Text("Zoom out."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "="); ImGui::SameLine(64); ImGui::Text("Zoom in."); ImGui::NextLine(); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), ","); ImGui::SameLine(64); ImGui::Text("MIP level up."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "."); ImGui::SameLine(64); ImGui::Text("MIP level down."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "/"); ImGui::SameLine(64); ImGui::Text("Toggle linear/point texture sampling."); ImGui::NextLine(); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "left"); ImGui::SameLine(64); ImGui::Text("Previous layer in texture array."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "right"); ImGui::SameLine(64); ImGui::Text("Next layer in texture array."); ImGui::NextLine(); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "up"); ImGui::SameLine(64); ImGui::Text("Previous texture."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "down"); ImGui::SameLine(64); ImGui::Text("Next texture."); ImGui::NextLine(); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "r/g/b"); ImGui::SameLine(64); ImGui::Text("Toggle R, G, or B color channel."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "a"); ImGui::SameLine(64); ImGui::Text("Toggle alpha blending."); ImGui::NextLine(); ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "s"); ImGui::SameLine(64); ImGui::Text("Toggle Multi-channel SDF rendering"); ImGui::PopFont(); ImGui::NextLine(); ImGui::Dummy(ImVec2(0.0f, 0.0f) ); ImGui::SameLine(ImGui::GetWindowWidth() - 136.0f); if (ImGui::Button("Close", ImVec2(128.0f, 0.0f) ) || !view.m_help) { view.m_help = false; ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); } help = view.m_help; imguiEndFrame(); if (!bgfx::isValid(texture) || view.m_fileIndex != fileIndex) { if (bgfx::isValid(texture) ) { bgfx::destroyTexture(texture); } fileIndex = view.m_fileIndex; filePath = view.m_fileList[view.m_fileIndex].c_str(); texture = loadTexture(filePath , 0 | BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP | BGFX_TEXTURE_W_CLAMP , 0 , &view.m_info ); std::string title; bx::stringPrintf(title, "%s (%d x %d%s, %s)" , filePath , view.m_info.width , view.m_info.height , view.m_info.cubeMap ? " CubeMap" : "" , bgfx::getName(view.m_info.format) ); entry::WindowHandle handle = { 0 }; entry::setWindowTitle(handle, title.c_str() ); } int64_t now = bx::getHPCounter(); static int64_t last = now; const int64_t frameTime = now - last; last = now; const double freq = double(bx::getHPFrequency() ); time += (float)(frameTime*speed/freq); float ortho[16]; bx::mtxOrtho(ortho, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f); bgfx::setViewTransform(0, NULL, ortho); bgfx::setViewRect(0, 0, 0, width, height); bgfx::touch(0); bgfx::dbgTextClear(); scale.set( bx::fmin( float(width) / float(view.m_info.width) , float(height) / float(view.m_info.height) ) , 0.1f ); zoom.set(view.m_zoom, 0.25); float ss = scale.getValue() * zoom.getValue(); screenQuad( int(width - view.m_info.width * ss)/2 , int(height - view.m_info.height * ss)/2 , int(view.m_info.width * ss) , int(view.m_info.height * ss) , view.m_abgr ); float mtx[16]; bx::mtxRotateXY(mtx, 0.0f, time); bgfx::setUniform(u_mtx, mtx); mip.set(float(view.m_mip), 0.5f); layer.set(float(view.m_layer), 0.25f); float params[4] = { mip.getValue(), layer.getValue(), 0.0f, 0.0f }; bgfx::setUniform(u_params, params); bgfx::setTexture(0 , s_texColor , texture , view.m_filter ? BGFX_TEXTURE_NONE : 0 | BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MIP_POINT | BGFX_TEXTURE_MAG_POINT ); bgfx::setState(0 | BGFX_STATE_RGB_WRITE | BGFX_STATE_ALPHA_WRITE | (view.m_alpha ? BGFX_STATE_BLEND_ALPHA : BGFX_STATE_NONE) ); bgfx::submit(0 , view.m_info.cubeMap ? textureCubeProgram : 1 < view.m_info.numLayers ? textureArrayProgram : view.m_sdf ? textureSDFProgram : textureProgram ); bgfx::frame(); } } if (bgfx::isValid(texture) ) { bgfx::destroyTexture(texture); } bgfx::destroyUniform(s_texColor); bgfx::destroyUniform(u_mtx); bgfx::destroyUniform(u_params); bgfx::destroyProgram(textureProgram); bgfx::destroyProgram(textureArrayProgram); bgfx::destroyProgram(textureCubeProgram); imguiDestroy(); bgfx::shutdown(); return exitcode; }
void init_cmdline_interface(){ cmdInit(115200); cmdAdd("help", help); cmdAdd("h", help); cmdAdd("?", help); cmdAdd("", Nop); cmdAdd("hello", hello); cmdAdd("BackToNoHost", BackToNoHost_cmd); cmdAdd("InitDevInfo", InitDevInfo_cmd); cmdAdd("SEState", SE_state_cmd); cmdAdd("BindReg", BindReg_cmd); cmdAdd("BindLogin", BindLogin_cmd); cmdAdd("BindLogout", BindLogout_cmd); cmdAdd("BackToNoHost", BackToNoHost_cmd); cmdAdd("BackToInit",BackToInit_cmd); cmdAdd("InitWallet", InitWallet_cmd); cmdAdd("PINAuth", PIN_Auth_cmd); cmdAdd("QueryWalletInfo", hdw_query_wallet_info_cmd); cmdAdd("QueryAllAccount", hdw_query_all_account_info_cmd); cmdAdd("QueryAccountKey", hdw_query_account_key_info_cmd); cmdAdd("CreateAccount", hdw_create_account_cmd); cmdAdd("QueryAccountInfo", hdw_query_account_info_cmd); cmdAdd("CreateNextAddr", hdw_generate_next_trx_addr_cmd); //cmdAdd("SetSecurityPolicy", SetSecurityPolicy_cmd); cmdAdd("Transaction", Transaction_cmd); cmdAdd("Voltage", ReadVoltage_cmd); cmdAdd("ReinitBLE", ReinitBLE_cmd); cmdAdd("AddVcard", AddVcard_cmd); cmdAdd("ResetHitconTokenDisplay", ResetHitconTokenDisplay); Serial.println("**************************************************************************"); for (int i = 0; i < 10; ++i) { Serial.print("*");Serial.print(HitconBanner[i]);Serial.println("*"); } Serial.println("**************************************************************************"); Serial.println("Hitcon Badge 2018 Cmdline interface\r\nVersion:1.0.12\r\nenter help to see the cmd list"); cmd_display(); }
int main(int _argc, char** _argv) { //DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME); if (BX_ENABLED(ENTRY_CONFIG_PROFILER) ) { rmtSettings* settings = rmt_Settings(); BX_WARN(NULL != settings, "Remotery is not enabled."); if (NULL != settings) { settings->malloc = rmtMalloc; settings->realloc = rmtRealloc; settings->free = rmtFree; rmtError err = rmt_CreateGlobalInstance(&s_rmt); BX_WARN(RMT_ERROR_NONE != err, "Remotery failed to create global instance."); if (RMT_ERROR_NONE == err) { rmt_SetCurrentThreadName("Main"); } else { s_rmt = NULL; } } } #if BX_CONFIG_CRT_FILE_READER_WRITER s_fileReader = new bx::CrtFileReader; s_fileWriter = new bx::CrtFileWriter; #endif // BX_CONFIG_CRT_FILE_READER_WRITER cmdInit(); cmdAdd("mouselock", cmdMouseLock); cmdAdd("graphics", cmdGraphics ); cmdAdd("exit", cmdExit ); inputInit(); inputAddBindings("bindings", s_bindings); entry::WindowHandle defaultWindow = { 0 }; entry::setWindowTitle(defaultWindow, bx::baseName(_argv[0]) ); setWindowSize(defaultWindow, ENTRY_DEFAULT_WIDTH, ENTRY_DEFAULT_HEIGHT); int32_t result = ::_main_(_argc, _argv); inputRemoveBindings("bindings"); inputShutdown(); cmdShutdown(); #if BX_CONFIG_CRT_FILE_READER_WRITER delete s_fileReader; s_fileReader = NULL; delete s_fileWriter; s_fileWriter = NULL; #endif // BX_CONFIG_CRT_FILE_READER_WRITER if (BX_ENABLED(ENTRY_CONFIG_PROFILER) && NULL != s_rmt) { rmt_DestroyGlobalInstance(s_rmt); } return result; }
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 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; } }