|
| 1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| 2 | +<html xmlns="http://www.w3.org/1999/xhtml"> |
| 3 | +<head> |
| 4 | +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> |
| 5 | +<meta http-equiv="X-UA-Compatible" content="IE=9"/> |
| 6 | +<meta name="generator" content="Doxygen 1.12.0"/> |
| 7 | +<meta name="viewport" content="width=device-width, initial-scale=1"/> |
| 8 | +<!-- BEGIN opengraph metadata --> |
| 9 | +<meta property="og:title" content="Archicad C++ API" /> |
| 10 | +<meta property="og:image" content="logo.svg" /> |
| 11 | +<meta property="og:description" content="Archicad Development Kit Documentation, best practices, example codes and information hub." /> |
| 12 | +<meta property="og:url" content="https://archicadapi.graphisoft.com/documentation/" /> |
| 13 | +<!-- END opengraph metadata --> |
| 14 | +<!-- BEGIN twitter metadata --> |
| 15 | +<meta name="twitter:image:src" content="logo.svg" /> |
| 16 | +<meta name="twitter:title" content="Archicad C++ API" /> |
| 17 | +<meta name="twitter:description" content="Archicad Development Kit Documentation, best practices, example codes and information hub." /> |
| 18 | +<!-- END twitter metadata --> |
| 19 | +<title>Archicad 29 C++ API: Custom panels in settings dialogs</title> |
| 20 | +<link href="tabs.css" rel="stylesheet" type="text/css"/> |
| 21 | +<script type="text/javascript" src="jquery.js"></script> |
| 22 | +<script type="text/javascript" src="dynsections.js"></script> |
| 23 | +<script type="text/javascript" src="doxygen-awesome-darkmode-toggle.js"></script> |
| 24 | +<script type="text/javascript" src="doxygen-awesome-fragment-copy-button.js"></script> |
| 25 | +<script type="text/javascript" src="doxygen-awesome-paragraph-link.js"></script> |
| 26 | +<script type="text/javascript" src="doxygen-awesome-interactive-toc.js"></script> |
| 27 | +<script type="text/javascript" src="doxygen-awesome-tabs.js"></script> |
| 28 | +<script type="text/javascript"> |
| 29 | + DoxygenAwesomeFragmentCopyButton.init() |
| 30 | + DoxygenAwesomeDarkModeToggle.init() |
| 31 | + DoxygenAwesomeParagraphLink.init() |
| 32 | + DoxygenAwesomeInteractiveToc.init() |
| 33 | + DoxygenAwesomeTabs.init() |
| 34 | +</script> |
| 35 | +<link href="navtree.css" rel="stylesheet" type="text/css"/> |
| 36 | +<script type="text/javascript" src="navtreedata.js"></script> |
| 37 | +<script type="text/javascript" src="navtree.js"></script> |
| 38 | +<script type="text/javascript" src="resize.js"></script> |
| 39 | +<script type="text/javascript" src="cookie.js"></script> |
| 40 | +<link href="search/search.css" rel="stylesheet" type="text/css"/> |
| 41 | +<script type="text/javascript" src="search/searchdata.js"></script> |
| 42 | +<script type="text/javascript" src="search/search.js"></script> |
| 43 | +<link href="doxygen.css" rel="stylesheet" type="text/css" /> |
| 44 | +<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/> |
| 45 | +<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/> |
| 46 | +<link href="doxygen-awesome-sidebar-only-darkmode-toggle.css" rel="stylesheet" type="text/css"/> |
| 47 | +<link href="custom.css" rel="stylesheet" type="text/css"/> |
| 48 | +<link href="https://fonts.cdnfonts.com/css/proxima-nova-2" rel="stylesheet"> |
| 49 | +<link rel="icon" href="logo.svg" /> |
| 50 | +</head> |
| 51 | +<body> |
| 52 | +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> |
| 53 | +<div id="titlearea"> |
| 54 | +<table cellspacing="0" cellpadding="0"> |
| 55 | + <tbody> |
| 56 | + <tr style="height: 56px;"> |
| 57 | + <td id="projectlogo"><img alt="Logo" src="logo.svg"/></td> |
| 58 | + <td id="projectalign" style="padding-left: 0.5em;"> |
| 59 | + <div id="projectname">Archicad 29 C++ API |
| 60 | + </div> |
| 61 | + </td> |
| 62 | + </tr> |
| 63 | + </tbody> |
| 64 | +</table> |
| 65 | +</div> |
| 66 | +<!-- end header part --> |
| 67 | +<!-- Generated by Doxygen 1.12.0 --> |
| 68 | +<script type="text/javascript"> |
| 69 | +/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ |
| 70 | +var searchBox = new SearchBox("searchBox", "search/",'.html'); |
| 71 | +/* @license-end */ |
| 72 | +</script> |
| 73 | +<script type="text/javascript"> |
| 74 | +/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ |
| 75 | +$(function() { codefold.init(0); }); |
| 76 | +/* @license-end */ |
| 77 | +</script> |
| 78 | +<script type="text/javascript" src="menudata.js"></script> |
| 79 | +<script type="text/javascript" src="menu.js"></script> |
| 80 | +<script type="text/javascript"> |
| 81 | +/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ |
| 82 | +$(function() { |
| 83 | + initMenu('',true,false,'search.php','Search',true); |
| 84 | + $(function() { init_search(); }); |
| 85 | +}); |
| 86 | +/* @license-end */ |
| 87 | +</script> |
| 88 | +<div id="main-nav"></div> |
| 89 | +</div><!-- top --> |
| 90 | +<div id="side-nav" class="ui-resizable side-nav-resizable"> |
| 91 | + <div id="nav-tree"> |
| 92 | + <div id="nav-tree-contents"> |
| 93 | + <div id="nav-sync" class="sync"></div> |
| 94 | + </div> |
| 95 | + </div> |
| 96 | + <div id="splitbar" style="-moz-user-select:none;" |
| 97 | + class="ui-resizable-handle"> |
| 98 | + </div> |
| 99 | +</div> |
| 100 | +<script type="text/javascript"> |
| 101 | +/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */ |
| 102 | +$(function(){initNavTree('_custom_panels.html',''); initResizable(true); }); |
| 103 | +/* @license-end */ |
| 104 | +</script> |
| 105 | +<div id="doc-content"> |
| 106 | +<!-- window showing the filter options --> |
| 107 | +<div id="MSearchSelectWindow" |
| 108 | + onmouseover="return searchBox.OnSearchSelectShow()" |
| 109 | + onmouseout="return searchBox.OnSearchSelectHide()" |
| 110 | + onkeydown="return searchBox.OnSearchSelectKey(event)"> |
| 111 | +</div> |
| 112 | + |
| 113 | +<!-- iframe showing the search results (closed by default) --> |
| 114 | +<div id="MSearchResultsWindow"> |
| 115 | +<div id="MSearchResults"> |
| 116 | +<div class="SRPage"> |
| 117 | +<div id="SRIndex"> |
| 118 | +<div id="SRResults"></div> |
| 119 | +<div class="SRStatus" id="Loading">Loading...</div> |
| 120 | +<div class="SRStatus" id="Searching">Searching...</div> |
| 121 | +<div class="SRStatus" id="NoMatches">No Matches</div> |
| 122 | +</div> |
| 123 | +</div> |
| 124 | +</div> |
| 125 | +</div> |
| 126 | + |
| 127 | +<div><div class="header"> |
| 128 | + <div class="headertitle"><div class="title">Custom panels in settings dialogs</div></div> |
| 129 | +</div><!--header--> |
| 130 | +<div class="contents"> |
| 131 | +<div class="textblock"><h1><a class="anchor" id="autotoc_md8"></a> |
| 132 | +Custom panels in settings dialogs</h1> |
| 133 | +<p>From Archicad 8 you have possibility to add user interface components integrated into the standard settings dialogs to handle your custom element and attribute data. You can append your additional panels into the</p> |
| 134 | +<ul> |
| 135 | +<li>element settings dialogs</li> |
| 136 | +<li>attribute settings dialogs</li> |
| 137 | +<li>info box</li> |
| 138 | +</ul> |
| 139 | +<h2><a class="anchor" id="autotoc_md9"></a> |
| 140 | +Registration of panels</h2> |
| 141 | +<p>First in the <a class="el" href="group___add_on_lifetime.html#ga3d5b6a23422e44dce66728b0f4eb943e">RegisterInterface</a> function you should let the server application know that the add-on wants to add a custom panel into one of the settings dialogs. The dialog is specified with element ID and variation in case of element settings, or the attribute ID in case of attribute settings. You must also pass the resource IDs of the relevant interface resources, such as the icon and the title string of the panel and the tabpage dialog itself.</p> |
| 142 | +<p>From Archicad 11 an optional <code>visibleByDefault</code> parameter is added to control the default appearance of the panel. If you pass <em>true</em>, the panel will be visible on the specified settings dialog or info box, unless the effective Work Environment settings override the actual visibility of the panel.</p> |
| 143 | +<p>In Archicad 12 an optional <code>growType</code> parameter is added to control the grow type (none/horizontal/vertical/both) of the element and attribute settings panel.</p> |
| 144 | +<p>The details can be found at the description of the functions:</p> |
| 145 | +<ul> |
| 146 | +<li><a class="el" href="group___add_on_integration.html#ga21fdf6041a8880779b349d2a8ce685c2">ACAPI_AddOnIntegration_RegisterSettingsPanel</a></li> |
| 147 | +<li><a class="el" href="group___add_on_integration.html#ga9069a54766487ef3e1c2c8c1ba99f97a">ACAPI_AddOnIntegration_RegisterAttributePanel</a></li> |
| 148 | +<li><a class="el" href="group___add_on_integration.html#ga3ff255f04b61d4e618c3d3000ef4a9c9">ACAPI_AddOnIntegration_RegisterInfoBoxPanel</a></li> |
| 149 | +</ul> |
| 150 | +<h2><a class="anchor" id="autotoc_md10"></a> |
| 151 | +Installing the panel handlers</h2> |
| 152 | +<p>After registering the custom panels the add-on should initialize the handlers in its <a class="el" href="group___add_on_lifetime.html#gaa8f1f7d553305c1afe5de7e4dcb66e99">Initialize</a> function. In order to be called in the program starting phase the add-on must be preloaded type, that is the return value of the <a class="el" href="group___add_on_lifetime.html#gaf36d63d09853e5344932b63ee23d2bb9">CheckEnvironment</a> must be <b>APIAddon_Preload</b>.</p> |
| 153 | +<p>The element or attribute settings panel is represented by an object derived from the <code>TBUI::APIToolUIPanel</code> or <code>VBAD::APIAttrUIPanel</code> classes respectively. These classes contain an observer to the tabpage including the element or attribute data, and a reference to the dialog item itself. The observers are supposed to handle the corresponding database and dialog user action events.</p> |
| 154 | +<p>In order to utilize these classes the add-on must include the **_UCLib_**, **_UDLib_** and **_VBElemDialogs_** modules. <em>(The interface of these modules are not documented.)</em></p> |
| 155 | +<p>When the panel objects are successfully constructed, the panel creation and destruction handler functions should be passed to the API with <a class="el" href="group___add_on_integration.html#ga29fa171b94724463b999dcbfb3abae27">ACAPI_AddOnIntegration_InstallPanelHandler</a>.</p> |
| 156 | +<h2><a class="anchor" id="autotoc_md11"></a> |
| 157 | +Creating and destroying the tabpages</h2> |
| 158 | +<p>It is important to know that the tab pages as dialog items are constructed only on demand, that is when the user chooses to open a settings dialog, in which your add-on has registered a custom panel, the Dialog Manager builds up the dialog panel-by-panel. When the dialog construction process arrives to your panel, it calls the installed <a class="el" href="group___add_on_integration.html#gafdc162d4dfa6f37018cdaf355a9b13cd">APIPanelCreateProc</a>, where the add-on can create the dialog items themselves and attach an observer to the tabpage. After closing the settings dialog all panels are destroyed; the <a class="el" href="group___add_on_integration.html#ga5f18cfb0fd48427380b832d480476097">APIPanelDestroyProc</a> is called to detach the observer and destruct the tabpage object.</p> |
| 159 | +<p>In case of info box panels the create-destroy events happen when the info box switches to and from the corresponding toolbox mode.</p> |
| 160 | +<p>You can get more experience regarding this topic by studying the **_Panel_Test_** example add-on. </p> |
| 161 | +</div></div><!-- contents --> |
| 162 | +</div><!-- PageDoc --> |
| 163 | +</div><!-- doc-content --> |
| 164 | +</body> |
| 165 | +</html> |
0 commit comments