28using namespace std::string_literals;
37 if (!
gROOT->IsWebDisplayBatch()) {
39 fWebWindow->SetDefaultPage(
"file:rootui5sys/geom/index.html");
114 std::string user_args =
"";
116 user_args =
"{ nobrowser: true }";
118 user_args =
"{ show_columns: true }";
124 if ((
fWebWindow->NumConnections(
true) == 0) || always_start_new_browser)
157 std::vector<int> *stack{
nullptr}, res;
193 if (first_time || json1.empty())
238 if (
json.find(
"GDRAW:") != 0) {
239 printf(
"GDRAW missing!!!!\n");
253 if (arg ==
"GETDRAW") {
257 }
else if (arg ==
"QUIT_ROOT") {
261 }
else if (arg.compare(0, 9,
"HCHANNEL:") == 0) {
263 int chid = std::stoi(arg.substr(9));
269 }
else if (arg.compare(0, 4,
"GET:") == 0) {
276 std::string
json{
"SHAPE:"};
282 }
else if (arg.compare(0, 10,
"HIGHLIGHT:") == 0) {
283 auto stack = TBufferJSON::FromJSON<std::vector<int>>(arg.substr(10));
286 }
else if (arg.compare(0, 6,
"IMAGE:") == 0) {
287 auto separ = arg.find(
"::", 6);
288 if (separ == std::string::npos)
291 std::string fname = arg.substr(6, separ - 6);
297 fname += std::to_string(cnt);
304 std::ofstream ofs(fname);
308 printf(
"Image file %s size %d has been created\n", fname.c_str(), (
int)binary.
Length());
310 }
else if (arg.compare(0, 4,
"CFG:") == 0) {
315 }
else if (arg ==
"RELOAD") {
319 }
else if (arg.compare(0, 9,
"ACTIVATE:") == 0) {
322 }
else if (arg.compare(0, 11,
"INFOACTIVE:") == 0) {
324 }
else if (arg.compare(0, 11,
"HIDE_ITEMS:") == 0) {
325 auto items = TBufferJSON::FromJSON<std::vector<std::string>>(arg.substr(11));
326 bool changed =
false;
328 for (
auto &itemname : *items)
335 }
else if (arg ==
"SAVEMACRO") {
358 if ((kind ==
"SelectTop") || (kind ==
"NodeVisibility")) {
360 }
else if (kind ==
"ChangeSearch") {
366 }
else if (kind ==
"ClearSearch") {
369 }
else if (kind ==
"HighlightItem") {
373 }
else if (kind ==
"ClickItem") {
390 std::ofstream
fs(fname);
393 std::string prefix =
" ";
395 auto p = fname.find(
".");
397 fs <<
"void " << fname.substr(0,
p) <<
"() { " << std::endl;
399 fs <<
"{" << std::endl;
406 fs << prefix <<
"// geometry is too large, please provide import like:" << std::endl << std::endl;
407 fs << prefix <<
"// TGeoManager::Import(\"filename.root\");" << std::endl;
412 fs << prefix <<
"auto viewer = std::make_shared<ROOT::RGeomViewer>(gGeoManager";
415 fs <<
");" << std::endl;
419 fs << prefix <<
"viewer->SetShowHierarchy(" << (
fShowHierarchy ?
"true" :
"false") <<
");" << std::endl;
420 fs << prefix <<
"viewer->SetShowColumns(" << (
fShowColumns ?
"true" :
"false") <<
");" << std::endl;
424 fs << prefix <<
"viewer->Show();" << std::endl << std::endl;
426 fs << prefix <<
"ROOT::Experimental::RDirectory::Heap().Add(\"geom_viewer\", viewer);" << std::endl;
428 fs <<
"}" << std::endl;
#define R__LOG_ERROR(...)
#define R__LOG_DEBUG(DEBUGLEVEL,...)
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize fs
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
R__EXTERN TSystem * gSystem
bool ProduceDrawingFor(int nodeid, std::string &json, bool check_volume=false)
Produce shape rendering data for given stack All nodes, which are referencing same shape will be tran...
std::unique_ptr< RGeomNodeInfo > MakeNodeInfo(const std::vector< int > &stack)
Change visibility for specified element Returns true if changes was performed.
bool HasDrawData() const
Check if there is draw data available.
void IssueSignal(const void *handler, const std::string &kind)
Issue signal, which distributed on all handlers - excluding source handler.
bool SetHighlightedItem(const std::vector< int > &stack)
void SetPreferredOffline(bool on)
Set preference of offline operations.
void ClearCache()
Clear cached data, need to be clear when connection broken.
std::string GetDrawJson() const
std::vector< int > MakeStackByIds(const std::vector< int > &ids)
Creates stack for given array of ids, first element always should be 0.
void SavePrimitive(std::ostream &fs, const std::string &name)
Save geometry configuration as C++ macro.
bool SetActiveItem(const std::string &itemname)
int GetNumNodes() const
Number of unique nodes in the geometry.
void ProduceDrawData()
Collect all information required to draw geometry on the client This includes list of each visible no...
bool SetPhysNodeVisibility(const std::vector< std::string > &path, bool on=true)
Set visibility of physical node by path It overrules TGeo visibility flags - but only for specific ph...
void AddSignalHandler(const void *handler, RGeomSignalFunc_t func)
Add signal handler.
bool ChangeConfiguration(const std::string &json)
Change configuration by client Returns true if any parameter was really changed.
std::vector< int > GetClickedItem() const
void ProduceSearchData()
Produces search data if necessary.
void SetJsonComp(int comp=0)
Set JSON compression level for data transfer.
void SetBuildShapes(int lvl=1)
Instruct to build binary 3D model already on the server (true) or send TGeoShape as is to client,...
void SetDrawOptions(const std::string &opt="")
Set draw options as string for JSROOT TGeoPainter.
std::vector< int > GetHighlightedItem() const
void RemoveSignalHandler(const void *handler)
Remove signal handler.
int FindNodeId(const std::vector< int > &stack)
Returns nodeid for given stack array, returns -1 in case of failure.
std::string GetSearchJson() const
int GetJsonComp() const
Returns JSON compression level for data transfer.
void Build(TGeoManager *mgr, const std::string &volname="")
Collect information about geometry hierarchy into flat list like it done in JSROOT ClonedNodes....
RGeomViewer(TGeoManager *mgr=nullptr, const std::string &volname="")
constructor
void Show(const RWebDisplayArgs &args="", bool always_start_new_browser=false)
Show or update geometry in web window If web browser already started - just refresh drawing like "rel...
void SetGeometry(TGeoManager *mgr, const std::string &volname="")
assign new geometry to the viewer
std::vector< int > GetStackFromJson(const std::string &json, bool node_ids=false)
convert JSON into stack array
virtual ~RGeomViewer()
destructor
void SendGeometry(unsigned connid=0, bool first_time=false)
Send data for principal geometry draw Should be used when essential settings were changed in geometry...
std::string GetWindowAddr() const
Return URL address of web window used for geometry viewer.
std::shared_ptr< RGeomHierarchy > fWebHierarchy
! web handle for hierarchy part
void WebWindowDisconnect(unsigned connid)
Process disconnect event Clear cache data and dependent connections.
void ClearOnClose(const std::shared_ptr< void > &handle)
Set handle which will be cleared when connection is closed Must be called after window is shown.
bool fShowHierarchy
! if hierarchy visible by default
bool GetShowColumns() const
void SaveAsMacro(const std::string &fname)
Save viewer configuration as macro.
std::shared_ptr< RWebWindow > fWebWindow
! web window to show geometry
void Update()
Update geometry drawings in all web displays.
void ProcessSignal(const std::string &)
Process signal from geom description when it changed by any means.
bool GetShowHierarchy() const
Returns default hierarchy browser visibility.
void SetDrawOptions(const std::string &opt)
Configures draw option for geometry Normally has effect before first drawing of the geometry When geo...
TGeoManager * fGeoManager
! geometry to show
bool fShowColumns
! show columns in hierarchy
std::string fSelectedVolume
! name of selected volume
void WebWindowCallback(unsigned connid, const std::string &arg)
Process data from client.
bool fInfoActive
! true when info page active and node info need to be provided
void SetOnlyVolume(TGeoVolume *vol)
Draw only specified volume, special case when volume stored without valid geomanager.
void SelectVolume(const std::string &volname)
Select visible top volume, all other volumes will be disabled.
void SaveImage(const std::string &fname="geometry.png", int width=0, int height=0)
Produce PNG image of the geometry If web-browser is shown and drawing completed, image is requested f...
RGeomDescription fDesc
! geometry description, send to the client as first message
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
const std::string & GetWidgetKind() const
returns widget kind
static bool ProduceImage(const std::string &fname, const std::string &json, int width=800, int height=600, const char *batch_file=nullptr)
Produce image file using JSON data as source Invokes JSROOT drawing functionality in headless browser...
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
static TString ToJSON(const T *obj, Int_t compact=0, const char *member_name=nullptr)
@ kSkipTypeInfo
do not store typenames in JSON
@ kNoSpaces
no new lines plus remove all spaces around "," and ":" symbols
@ kSameSuppression
zero suppression plus compress many similar values together
static Bool_t FromJSON(T *&obj, const char *json)
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
The manager class for any TGeo geometry.
Int_t GetVisLevel() const
Returns current depth to which geometry is drawn.
TGeoVolume * GetTopVolume() const
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
const char * Data() const
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
Experimental::RLogChannel & RGeomLog()
Log channel for Geomviewer diagnostics.