28using namespace std::string_literals;
36 fWebWindow->SetDefaultPage(
"file:rootui5sys/eve7/geom.html");
65 fSelectedVolume = volname;
67 fDesc.Build(mgr, volname);
78 if (volname != fSelectedVolume)
79 SetGeometry(fGeoManager, volname);
90 std::string user_args =
"";
91 if (!GetShowHierarchy()) user_args =
"{ nobrowser: true }";
92 fWebWindow->SetUserArgs(user_args);
97 if ((fWebWindow->NumConnections(
true) == 0) || always_start_new_browser)
98 fWebWindow->Show(args);
108 if (!fWebWindow)
return "";
109 return fWebWindow->GetAddr();
117 fWebWindow->Send(0,
"RELOAD");
125 std::vector<int> *stack{
nullptr}, res;
128 if (node_ids) res = fDesc.MakeStackByIds(*stack);
143 if (!fDesc.HasDrawData())
144 fDesc.CollectVisibles();
146 auto &
json = fDesc.GetDrawJson();
150 fWebWindow->Send(connid,
json);
160 fDesc.SetDrawOptions(opt);
161 unsigned connid = fWebWindow->GetConnectionId();
163 fWebWindow->Send(connid,
"DROPT:"s + opt);
173 unsigned connid = fWebWindow->GetConnectionId();
175 fWebWindow->Send(connid,
"IMAGE:"s + fname);
183 printf(
"Recv %s\n", arg.substr(0,100).c_str());
185 if (arg ==
"GETDRAW") {
187 SendGeometry(connid);
189 }
else if (arg ==
"QUIT_ROOT") {
191 fWebWindow->TerminateROOT();
193 }
else if (arg.compare(0, 7,
"SEARCH:") == 0) {
195 std::string query = arg.substr(7);
197 std::string hjson,
json;
199 auto nmatches = fDesc.SearchVisibles(query, hjson,
json);
201 printf(
"Searches %s found %d hjson %d json %d\n", query.c_str(), nmatches, (
int) hjson.length(), (
int)
json.length());
204 fWebWindow->Send(connid, hjson);
207 fWebWindow->Send(connid,
json);
209 }
else if (arg.compare(0,4,
"GET:") == 0) {
212 auto stack = GetStackFromJson(arg.substr(4));
214 auto nodeid = fDesc.FindNodeId(stack);
216 std::string
json{
"SHAPE:"};
218 fDesc.ProduceDrawingFor(nodeid,
json);
220 printf(
"Produce shape for stack json %d\n", (
int)
json.length());
222 fWebWindow->Send(connid,
json);
224 }
else if (arg.compare(0, 6,
"GVREQ:") == 0) {
226 auto req = TBufferJSON::FromJSON<REveGeomRequest>(arg.substr(6));
228 if (req && (req->oper ==
"HOVER")) {
229 if ((req->path.size() > 0 ) && (req->path[0] !=
"OFF"))
230 req->stack = fDesc.MakeStackByPath(req->path);
232 }
else if (req && (req->oper ==
"HIGHL")) {
233 if (req->stack.size() > 0)
234 req->path = fDesc.MakePathByStack(req->stack);
236 }
else if (req && (req->oper ==
"INFO")) {
238 auto info = fDesc.MakeNodeInfo(req->path);
252 }
else if ((arg.compare(0, 7,
"SETVI0:") == 0) || (arg.compare(0, 7,
"SETVI1:") == 0)) {
255 auto nodeid = std::stoi(arg.substr(7));
257 bool selected = (arg[5] ==
'1');
259 if (fDesc.ChangeNodeVisibility(nodeid, selected)) {
262 std::string json0 = fDesc.ProduceModifyReply(nodeid);
265 fWebWindow->Send(connid, json0);
267 if (selected && fDesc.IsPrincipalEndNode(nodeid)) {
271 std::string
json{
"APPND:"};
273 if (fDesc.ProduceDrawingFor(nodeid,
json,
true)) {
275 printf(
"Send appending JSON %d\n", (
int)
json.length());
277 fWebWindow->Send(connid,
json);
279 }
else if (selected) {
285 auto json = fDesc.ProcessBrowserRequest();
286 if (
json.length() > 0) fWebWindow->Send(connid,
json);
288 SendGeometry(connid);
291 }
else if (arg.compare(0,6,
"BRREQ:") == 0) {
295 if (!fDesc.IsBuild()) fDesc.Build(fGeoManager);
297 auto json = fDesc.ProcessBrowserRequest(arg.substr(6));
298 if (
json.length() > 0) fWebWindow->Send(connid,
json);
299 }
else if (arg.compare(0,6,
"IMAGE:") == 0) {
300 auto separ = arg.find(
"::",6);
301 if (separ == std::string::npos)
return;
303 std::string fname = arg.substr(6, separ-6);
308 if (
cnt++>0) fname += std::to_string(
cnt);
315 std::ofstream ofs(fname);
319 printf(
"Image file %s size %d has been created\n", fname.c_str(), (
int) binary.
Length());
321 }
else if (arg.compare(0,4,
"CFG:") == 0) {
323 if (fDesc.ChangeConfiguration(arg.substr(4)))
324 SendGeometry(connid);
326 }
else if (arg ==
"RELOAD") {
328 SendGeometry(connid);
#define R__LOG_ERROR(...)
#define R__LOG_DEBUG(DEBUGLEVEL,...)
R__EXTERN TSystem * gSystem
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 SetPreferredOffline(bool on)
Set preference of offline operations.
void SaveImage(const std::string &fname="geometry.png")
Produce PNG image of drawn geometry Drawing should be completed at the moment Executed asynchronous -...
void SelectVolume(const std::string &volname)
Select visible top volume, all other volumes will be disabled.
void Update()
Update geometry drawings in all web displays.
void SendGeometry(unsigned connid)
Send data for principal geometry draw.
std::string GetWindowAddr() const
Return URL address of web window used for geometry viewer.
std::shared_ptr< RWebWindow > fWebWindow
! web window to show geometry
REveGeomDescription fDesc
! geometry description, send to the client as first message
REveGeomViewer(TGeoManager *mgr=nullptr, const std::string &volname="")
constructor
void WebWindowCallback(unsigned connid, const std::string &arg)
receive data from client
std::vector< int > GetStackFromJson(const std::string &json, bool node_ids=false)
convert JSON into stack array
virtual ~REveGeomViewer()
destructor
void SetDrawOptions(const std::string &opt)
Configures draw option for geometry Normally has effect before first drawing of the geometry When geo...
void SetGeometry(TGeoManager *mgr, const std::string &volname="")
assign new geometry to the viewer
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...
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
const std::string & GetWidgetKind() const
returns widget kind
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.
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.
RLogChannel & REveLog()
Log channel for Eve diagnostics.
static constexpr double s
basic_json< std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, double, std::allocator, adl_serializer, std::vector< std::uint8_t > > json