irie 0.0.49__py3-none-any.whl → 0.0.51__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of irie might be problematic. Click here for more details.

Files changed (37) hide show
  1. irie/apps/inventory/filters.py +11 -29
  2. irie/apps/inventory/models.py +3 -3
  3. irie/apps/inventory/views.py +9 -2
  4. irie/apps/prediction/admin.py +2 -1
  5. irie/apps/prediction/migrations/0004_sensorassignment.py +31 -0
  6. irie/apps/prediction/migrations/0005_remove_sensorassignment_offset_x_and_more.py +53 -0
  7. irie/apps/prediction/migrations/0006_remove_sensorassignment_show_x_and_more.py +25 -0
  8. irie/apps/prediction/models.py +22 -3
  9. irie/apps/prediction/runners/__init__.py +11 -2
  10. irie/apps/prediction/runners/opensees/__init__.py +114 -62
  11. irie/apps/prediction/runners/ssid.py +9 -10
  12. irie/apps/prediction/urls.py +12 -7
  13. irie/apps/prediction/views.py +81 -24
  14. irie/apps/static/assets/css/brace.css +5 -31
  15. irie/apps/static/assets/css/brace.css.map +1 -1
  16. irie/apps/static/assets/css/brace.min.css +2 -2
  17. irie/apps/templates/components/json-table.html +1 -0
  18. irie/apps/templates/includes/paginate.js +6 -0
  19. irie/apps/templates/includes/scripts.html +7 -20
  20. irie/apps/templates/inventory/asset-on-map.html +5 -5
  21. irie/apps/templates/inventory/sensor-upload.html +97 -262
  22. irie/apps/templates/networks/{networks.html → _networks.html} +0 -1
  23. irie/apps/templates/networks/networks.js +6 -4
  24. irie/apps/templates/prediction/asset-predictors.html +41 -47
  25. irie/apps/templates/prediction/{form-submission.html → create-mdof.html} +0 -21
  26. irie/apps/templates/prediction/new-runner.html +0 -20
  27. irie/apps/templates/prediction/predictor-profile.html +8 -134
  28. irie/apps/templates/prediction/viewer/veux-viewer.js +186 -0
  29. irie/apps/templates/prediction/xara-profile.html +221 -0
  30. irie/apps/templates/sensors/render-sensors.js +152 -0
  31. irie/init/management/commands/init_cesmd.py +2 -2
  32. {irie-0.0.49.dist-info → irie-0.0.51.dist-info}/METADATA +2 -3
  33. {irie-0.0.49.dist-info → irie-0.0.51.dist-info}/RECORD +37 -30
  34. {irie-0.0.49.dist-info → irie-0.0.51.dist-info}/WHEEL +1 -1
  35. /irie/apps/templates/prediction/{predictor-upload.html → create-model.html} +0 -0
  36. {irie-0.0.49.dist-info → irie-0.0.51.dist-info}/entry_points.txt +0 -0
  37. {irie-0.0.49.dist-info → irie-0.0.51.dist-info}/top_level.txt +0 -0
@@ -29,15 +29,6 @@ from irie.apps.prediction.predictor import PREDICTOR_TYPES
29
29
  from irie.apps.prediction.models import PredictorModel
30
30
  from .forms import PredictorForm
31
31
 
32
- @login_required(login_url="/login/")
33
- def new_prediction(request):
34
- context = {}
35
-
36
- page_template = "form-submission.html"
37
- context["segment"] = page_template
38
- html_template = loader.get_template("prediction/" + page_template)
39
- return HttpResponse(html_template.render(context, request))
40
-
41
32
 
42
33
  @login_required(login_url="/login/")
43
34
  def asset_predictors(request, calid):
@@ -67,11 +58,51 @@ def asset_predictors(request, calid):
67
58
  return HttpResponse(html_template.render(context, request))
68
59
 
69
60
 
61
+ @login_required(login_url="/login/")
62
+ def predictor_profile_detail(request, calid, preid):
63
+ print(preid)
64
+ try:
65
+ predictor = PredictorModel.objects.get(pk=int(preid))
66
+ except ObjectDoesNotExist:
67
+ return raise404(request, {})
68
+
69
+ sname = request.GET.get("section", None)
70
+
71
+ runner = PREDICTOR_TYPES[predictor.protocol](predictor)
72
+
73
+ try:
74
+ data, mesh = runner.structural_section(sname)
75
+ except Exception as e:
76
+ raise e
77
+ return HttpResponse(
78
+ json.dumps({"error": "Section not found"}),
79
+ content_type="application/json",
80
+ status=404
81
+ )
82
+ from veux.plane import PlaneModel
83
+ art = veux.create_artist(mesh, ndf=1, canvas="gltf")
84
+ art.draw_surfaces()
85
+ art.draw_outlines()
86
+
87
+ glb = art.canvas.to_glb()
88
+ return HttpResponse(glb, content_type="application/binary")
89
+ glb64 = base64.b64encode(glb).decode("utf-8")
90
+ # rendering = f"data:application/octet-stream;base64,{glb64}"
91
+ # rendering = art._repr_html_()
92
+ r = dict(
93
+ properties = {
94
+ "Area": 1.0,
95
+ "Inertia": 2.0
96
+ },
97
+ rendering = glb64 #rendering
98
+ )
99
+ return HttpResponse(json.dumps(r), content_type="application/json")
100
+
101
+
70
102
  @login_required(login_url="/login/")
71
103
  def predictor_profile(request, calid, preid):
72
104
 
73
105
  context = {}
74
- html_template = loader.get_template("prediction/predictor-profile.html")
75
106
  context["segment"] = "inventory"
76
107
 
77
108
  try:
@@ -85,13 +116,19 @@ def predictor_profile(request, calid, preid):
85
116
  return raise404(request, context)
86
117
 
87
118
  context["asset"] = asset
88
- context["predictor"] = PREDICTOR_TYPES[predictor.protocol](predictor)
119
+ context["runner"] = PREDICTOR_TYPES[predictor.protocol](predictor)
120
+ context["predictor"] = predictor
121
+ context["sensors"] = predictor.sensorassignment_set.all()
89
122
 
90
- try:
91
- return HttpResponse(html_template.render(context, request))
123
+ if predictor.protocol == PredictorModel.Protocol.TYPE1:
124
+ html_template = loader.get_template("prediction/xara-profile.html")
125
+ context["members"] = context["runner"].structural_members()
92
126
 
93
- except TemplateDoesNotExist:
94
- context["rendering"] = None
127
+ else:
128
+ html_template = loader.get_template("prediction/predictor-profile.html")
129
+
130
+
131
+ try:
95
132
  return HttpResponse(html_template.render(context, request))
96
133
 
97
134
  except Exception as e:
@@ -118,13 +155,13 @@ def asset_map(request, calid):
118
155
  context["render_src"] = asset.rendering
119
156
 
120
157
  elif request.method == "POST":
121
- from openbim.csi import load, create_model, collect_outlines
122
158
  # context["offset"] = json.dumps(list(reversed(list(asset.coordinates))))
123
159
  context["rotate"] = "[0, 0, 0]"
124
160
  context["scale"] = 1/3.2808 # TODO
125
161
 
126
162
  uploaded_file = request.FILES.get('config_file')
127
163
 
164
+ from openbim.csi import load, create_model, collect_outlines
128
165
  try:
129
166
  csi = load((str(line.decode()).replace("\r\n","\n") for line in uploaded_file.readlines()))
130
167
  except Exception as e:
@@ -155,12 +192,22 @@ def asset_map(request, calid):
155
192
 
156
193
 
157
194
 
195
+ @login_required(login_url="/login/")
196
+ def create_mdof(request):
197
+ "Create system id"
198
+ context = {}
199
+
200
+ page_template = "create-mdof.html"
201
+ context["segment"] = page_template
202
+ html_template = loader.get_template("prediction/" + page_template)
203
+ return HttpResponse(html_template.render(context, request))
204
+
158
205
 
159
206
  @login_required(login_url="/login/")
160
- def predictor_upload(request, calid):
207
+ def create_model(request, calid):
161
208
 
162
209
  asset = Asset.objects.get(calid=calid)
163
- html_template = loader.get_template("prediction/predictor-upload.html")
210
+ html_template = loader.get_template("prediction/create-model.html")
164
211
  r400 = loader.get_template("site/page-400.html")
165
212
  context = {
166
213
  "asset": asset,
@@ -170,24 +217,33 @@ def predictor_upload(request, calid):
170
217
  }
171
218
 
172
219
  if request.method == "POST":
173
- from openbim.csi import load, create_model, collect_outlines
174
220
  form = PredictorForm(request.POST, request.FILES)
175
221
 
176
222
  uploaded_file = request.FILES.get('config_file')
177
223
 
224
+ from openbim.csi import load, create_model, collect_outlines
225
+ # 1) Parse the CSI file
178
226
  try:
179
227
  csi = load((str(line.decode()).replace("\r\n","\n") for line in uploaded_file.readlines()))
180
228
  except Exception as e:
181
229
  return HttpResponse(r400.render({"message": json.dumps({"error": str(e)})}), status=400)
182
230
 
183
- model = create_model(csi, verbose=True)
231
+ # 2) Process CSI data into xara model
232
+ try:
233
+ model = create_model(csi, verbose=True)
234
+ except Exception as e:
235
+ return HttpResponse(r400.render({"message": json.dumps({"error": str(e)})}), status=400)
184
236
 
185
- # Generate the .glb file using veux
237
+ # 3) Render the model
186
238
  outlines = collect_outlines(csi, model.frame_tags)
187
- artist = veux.create_artist(model, canvas="gltf", vertical=3,
188
- model_config={"frame_outlines": outlines}
239
+ artist = veux.create_artist(model,
240
+ canvas="gltf",
241
+ vertical=3,
242
+ model_config={"frame_outlines": outlines}
189
243
  )
190
244
  artist.draw_surfaces()
245
+
246
+ # Generate the .glb file
191
247
  glb = artist.canvas.to_glb()
192
248
 
193
249
  if request.POST.get("action") == "commit":
@@ -198,7 +254,9 @@ def predictor_upload(request, calid):
198
254
  predictor.asset = asset
199
255
  predictor.name = form.cleaned_data['name']
200
256
  predictor.description = "empty"
257
+ predictor.protocol = PredictorModel.Protocol.TYPE1
201
258
 
259
+ predictor.config_file.save(uploaded_file.name, ContentFile(uploaded_file.read()), save=True)
202
260
  predictor.render_file.save(f"{uuid.uuid4()}.glb", ContentFile(glb), save=True)
203
261
  predictor.save()
204
262
 
@@ -210,7 +268,6 @@ def predictor_upload(request, calid):
210
268
 
211
269
  try:
212
270
  return HttpResponse(html_template.render(context, request))
213
- # return render(request, "prediction/predictor-upload.html", {"form": form})
214
271
 
215
272
  except Exception as e:
216
273
  if "DEBUG" in os.environ and os.environ["DEBUG"]:
@@ -4847,12 +4847,12 @@ textarea.form-control-lg {
4847
4847
 
4848
4848
  .nav-tabs {
4849
4849
  --bs-nav-tabs-border-width: 0.0625rem;
4850
- --bs-nav-tabs-border-color: #9CA3AF;
4851
- --bs-nav-tabs-border-radius: 0.5rem;
4852
- --bs-nav-tabs-link-hover-border-color: #E5E7EB #E5E7EB #9CA3AF;
4850
+ --bs-nav-tabs-border-color: #D1D5DB;
4851
+ --bs-nav-tabs-border-radius: 0.375rem;
4852
+ --bs-nav-tabs-link-hover-border-color: #E5E7EB #E5E7EB #D1D5DB;
4853
4853
  --bs-nav-tabs-link-active-color: #374151;
4854
- --bs-nav-tabs-link-active-bg: #9CA3AF;
4855
- --bs-nav-tabs-link-active-border-color: #9CA3AF;
4854
+ --bs-nav-tabs-link-active-bg: #F2F4F6;
4855
+ --bs-nav-tabs-link-active-border-color: #D1D5DB #D1D5DB #F2F4F6;
4856
4856
  border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
4857
4857
  }
4858
4858
  .nav-tabs .nav-link {
@@ -24245,28 +24245,6 @@ svg.text-dark .color-background {
24245
24245
  margin-top: 7.1875rem !important;
24246
24246
  }
24247
24247
 
24248
- .navbar-vertical .navbar-nav .nav-link[data-bs-toggle=collapse]:after {
24249
- display: inline-block;
24250
- font-style: normal;
24251
- font-variant: normal;
24252
- text-rendering: auto;
24253
- -webkit-font-smoothing: antialiased;
24254
- font-family: "Font Awesome 5 Free";
24255
- font-weight: 700;
24256
- content: "\f107";
24257
- margin-left: auto;
24258
- color: rgba(206, 212, 218, 0.7);
24259
- transition: all 0.2s ease;
24260
- }
24261
- @media (prefers-reduced-motion: reduce) {
24262
- .navbar-vertical .navbar-nav .nav-link[data-bs-toggle=collapse]:after {
24263
- transition: none;
24264
- }
24265
- }
24266
- .navbar-vertical .navbar-nav .nav-link[data-bs-toggle=collapse][aria-expanded=true]:after {
24267
- color: #CED4DA;
24268
- transform: rotate(180deg);
24269
- }
24270
24248
  .navbar-vertical .navbar-nav .nav-link[data-bs-toggle=collapse].active:after {
24271
24249
  color: #ffffff;
24272
24250
  }
@@ -29952,10 +29930,6 @@ label {
29952
29930
  padding: 1rem 1rem;
29953
29931
  background-color: #ffffff;
29954
29932
  }
29955
- .nav-tabs .nav-link.active {
29956
- color: #ffffff;
29957
- background-color: #1F2937;
29958
- }
29959
29933
  .nav-tabs.nav-dark .nav-link.active {
29960
29934
  color: #ffffff;
29961
29935
  background-color: #12358a;