Auswahl als Library-Item speichern (Step 3)
User selektiert in Rhino → klickt im Symbole-Tab 'Aus Auswahl' → Selection wird in eine .3dm-Datei verpackt + Library-Item entsteht (oder bestehendes wird aktualisiert). Backend (library.py): - save_selection_to_asset(doc, target_name): erstellt File3dm aus der aktuellen Selection, packt Geometry relativ zu BoundingBox.Min (Block- Origin am Ursprung), schreibt nach library/assets/ Backend (ProjectSettingsBridge): - SAVE_SELECTION_AS_LIBRARY-Handler: holt Selection, fragt bei neuen Items via Rhino-GetString nach Name, schreibt .3dm, fuegt Item zum Manifest oder updated bestehendes (variant '2d'/'3d') Frontend (Symbole-Tab): - List-Footer: 'Aus Datei' + 'Aus Auswahl' Pills (neues Item) - Pro 2D/3D-Slot im Detail: 'Datei wählen' + 'Aus Auswahl' Pills (Variante eines bestehenden Items befüllen) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1012,6 +1012,8 @@ class EbenenBridge(panel_base.BaseBridge):
|
||||
self._update_library_item(p)
|
||||
elif t == "DELETE_LIBRARY_ITEM":
|
||||
self._delete_library_item(p)
|
||||
elif t == "SAVE_SELECTION_AS_LIBRARY":
|
||||
self._save_selection_as_library(p)
|
||||
def _pick_texture(self, payload):
|
||||
slot = payload.get("slot") or "diffuse"
|
||||
try:
|
||||
@@ -1288,6 +1290,71 @@ class EbenenBridge(panel_base.BaseBridge):
|
||||
self._send_library()
|
||||
except Exception as ex:
|
||||
print("[PROJECT-SETTINGS] _delete_library_item:", ex)
|
||||
|
||||
def _save_selection_as_library(self, payload):
|
||||
"""Aktuelle Selection im Doc als Library-Item speichern.
|
||||
payload: {variant: '2d'|'3d', targetId?: str, itemType?: str}.
|
||||
Wenn targetId gesetzt: bestehendes Item updaten. Sonst:
|
||||
Rhino-Prompt nach Name + neues Item anlegen."""
|
||||
d = Rhino.RhinoDoc.ActiveDoc
|
||||
if d is None: return
|
||||
try:
|
||||
sel = list(d.Objects.GetSelectedObjects(False, False))
|
||||
except Exception: sel = []
|
||||
if not sel:
|
||||
self.send("LIBRARY_ERROR", {
|
||||
"msg": "Bitte erst Objekte in Rhino selektieren."})
|
||||
return
|
||||
import library
|
||||
variant = (payload.get("variant") or "2d").lower()
|
||||
if variant not in ("2d", "3d"): variant = "2d"
|
||||
target_id = (payload.get("targetId") or "").strip() or None
|
||||
item_type = payload.get("itemType") or "object"
|
||||
if item_type not in ("symbol", "object"): item_type = "object"
|
||||
# Name: bei bestehendem Item den Item-Name nehmen, sonst
|
||||
# Rhino-Prompt
|
||||
name = ""
|
||||
if target_id:
|
||||
m = library.load_manifest()
|
||||
for it in m.get("items", []):
|
||||
if it.get("id") == target_id:
|
||||
name = it.get("name") or "item"
|
||||
break
|
||||
else:
|
||||
try:
|
||||
import Rhino.Input.Custom as ric
|
||||
from Rhino.Input import GetResult
|
||||
gs = ric.GetString()
|
||||
gs.SetCommandPrompt("Name fuer neues Library-Item")
|
||||
gs.AcceptNothing(True)
|
||||
if gs.Get() == GetResult.String:
|
||||
name = (gs.StringResult() or "").strip()
|
||||
except Exception as ex:
|
||||
print("[PROJECT-SETTINGS] save_selection prompt:", ex)
|
||||
if not name: name = "Neues_Item"
|
||||
# Speichern
|
||||
rel = library.save_selection_to_asset(d, name + "_" + variant)
|
||||
if not rel:
|
||||
self.send("LIBRARY_ERROR", {
|
||||
"msg": "Konnte Selection nicht speichern."})
|
||||
return
|
||||
if target_id:
|
||||
library.update_item(target_id, {
|
||||
("files" + variant): [rel],
|
||||
})
|
||||
else:
|
||||
import uuid as _uuid
|
||||
new_id = "obj-" + _uuid.uuid4().hex[:10]
|
||||
item = {
|
||||
"id": new_id,
|
||||
"type": item_type,
|
||||
"name": name,
|
||||
"version": 1,
|
||||
"tags": [],
|
||||
("files" + variant): [rel],
|
||||
}
|
||||
library.add_item(item)
|
||||
self._send_library()
|
||||
b = _ProjectSettingsBridge()
|
||||
bridge_holder["form"] = panel_base.open_satellite_window(
|
||||
"project_settings",
|
||||
|
||||
Reference in New Issue
Block a user