diff --git a/3rd-party/arbor b/3rd-party/arbor index bf234aa..0ca5b20 160000 --- a/3rd-party/arbor +++ b/3rd-party/arbor @@ -1 +1 @@ -Subproject commit bf234aa82f497258d1f330ff9311d92463f1929a +Subproject commit 0ca5b20b7a525ea9cb902bdf1af9d85fdd578e33 diff --git a/CMakeLists.txt b/CMakeLists.txt index adcd2e3..dfe8396 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.27) find_package(Git) project(the-arbor-gui - VERSION 0.11.1 + VERSION 0.11.2 LANGUAGES C CXX) set(EXPORT_COMPILE_COMMANDS ON) @@ -186,22 +186,53 @@ if(ARBORGUI_BUILD_BUNDLE) set(ARBORGUI_ICON arbor.icns) set(ARBORGUI_ICON_PATH ${CMAKE_SOURCE_DIR}/images/${ARBORGUI_ICON}) - set_source_files_properties(${ARBORGUI_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - add_executable(arbor-gui MACOSX_BUNDLE ${ARBORGUI_ICON_PATH} ${gui_srcs} $) - set_target_properties(arbor-gui PROPERTIES MACOSX_BUNDLE_ICONFILE ${ARBORGUI_ICON}) + set(arbgui_resources) + set_source_files_properties(${CMAKE_SOURCE_DIR}/imgui.ini + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) + list(APPEND arbgui_resources ${CMAKE_SOURCE_DIR}/imgui.ini) + + file(GLOB_RECURSE shaders ${CMAKE_SOURCE_DIR}/glsl/*/*.glsl) + foreach(SHADER_FILE ${shaders}) + list(APPEND arbgui_resources ${SHADER_FILE}) + file(RELATIVE_PATH SHADER_REL ${CMAKE_SOURCE_DIR}/glsl ${SHADER_FILE}) + get_filename_component(SHADER_DIR ${SHADER_REL} DIRECTORY) + set_source_files_properties(${SHADER_FILE} + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources/glsl/${SHADER_DIR}) + endforeach() + + file(GLOB_RECURSE fonts ${CMAKE_SOURCE_DIR}/fonts/*/*.ttf) + foreach(FONT_FILE ${fonts}) + list(APPEND arbgui_resources ${FONT_FILE}) + file(RELATIVE_PATH FONT_REL ${CMAKE_SOURCE_DIR}/fonts ${FONT_FILE}) + get_filename_component(FONT_DIR ${FONT_REL} DIRECTORY) + set_source_files_properties(${FONT_FILE} + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources/fonts/${FONT_DIR}) + endforeach() + + set_source_files_properties(${CMAKE_SOURCE_DIR}/images/arbor.icns + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) + + add_executable(arbor-gui MACOSX_BUNDLE ${gui_srcs} $ ${arbgui_resources} ${CMAKE_SOURCE_DIR}/images/arbor.icns) + set_target_properties(arbor-gui + PROPERTIES + BUNDLE True + MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME} + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_ICONFILE ${ARBORGUI_ICON} + MACOSX_BUNDLE_INFO_STRING "A GUI for Arbor" + RESOURCE ${arbgui_resources}) target_compile_definitions(arbor-gui PUBLIC FMT_HEADER_ONLY) target_include_directories(arbor-gui PRIVATE src ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(arbor-gui PRIVATE ${ARBORGUI_LIBS} arbor arborio glbinding glfw arbor-gui-deps) install(TARGETS arbor-gui - BUNDLE DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION bin COMPONENT Runtime) - - install(FILES ${ARBORGUI_ICON_PATH} DESTINATION ${resource_path}) - install(FILES default.ini DESTINATION ${resource_path} RENAME imgui.ini) - install(DIRECTORY glsl DESTINATION ${resource_path}) - install(DIRECTORY fonts DESTINATION ${resource_path}) + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION bin COMPONENT Runtime) set(CPACK_BINARY_DRAGNDROP ON) set(CPACK_GENERATOR "DragNDrop") @@ -237,7 +268,7 @@ else() endif() # install resources - install(DIRECTORY glsl DESTINATION ${resource_path}) - install(DIRECTORY fonts DESTINATION ${resource_path}) - install(FILES default.ini DESTINATION ${resource_path} RENAME imgui.ini) + install(DIRECTORY glsl DESTINATION ${resource_path}) + install(DIRECTORY fonts DESTINATION ${resource_path}) + install(FILES imgui.ini DESTINATION ${resource_path}) endif() diff --git a/default.ini b/imgui.ini similarity index 100% rename from default.ini rename to imgui.ini diff --git a/src/loader.cpp b/src/loader.cpp index fc38a62..46e56de 100644 --- a/src/loader.cpp +++ b/src/loader.cpp @@ -23,7 +23,8 @@ loaded_morphology load_swc(const std::filesystem::path &fn, } loaded_morphology load_neuron_swc(const std::filesystem::path &fn) { - auto loaded = arborio::load_swc_neuron(fn); + arborio::swc_loader_options opts; + auto loaded = arborio::load_swc_neuron(fn, opts); loaded_morphology res{.morph=loaded.morphology}; for (const auto& [k, v]: loaded.labels.regions()) res.regions.emplace_back(k, to_string(v)); for (const auto& [k, v]: loaded.labels.locsets()) res.locsets.emplace_back(k, to_string(v)); @@ -31,6 +32,24 @@ loaded_morphology load_neuron_swc(const std::filesystem::path &fn) { return res; } +loaded_morphology load_cnic_swc(const std::filesystem::path &fn) { + arborio::swc_loader_options opts {.allow_non_monotonic_ids=true, + .allow_mismatched_tags=true, + .tags={{0, "undefined"}, + {1, "soma"}, {2, "axon"}, {3, "dend"}, {4, "apic"}, + {5, "fork point"}, + {6, "end point"}} + }; + + auto loaded = arborio::load_swc_neuron(fn, opts); + loaded_morphology res{.morph=loaded.morphology}; + for (const auto& [k, v]: loaded.labels.regions()) res.regions.emplace_back(k, to_string(v)); + for (const auto& [k, v]: loaded.labels.locsets()) res.locsets.emplace_back(k, to_string(v)); + log_info("Loaded SWC (Neuron) {} branches {} ", loaded.segment_tree.size(), loaded.morphology.num_branches()); + return res; +} + + loaded_morphology load_arbor_swc(const std::filesystem::path &fn) { auto loaded = arborio::load_swc_arbor(fn); loaded_morphology res{.morph=loaded.morphology}; @@ -78,7 +97,8 @@ static std::unordered_map>> loaders{{".swc", {{"Arbor", load_arbor_swc}, - {"Neuron", load_neuron_swc}}}, + {"Neuron", load_neuron_swc}, + {"CNIC", load_cnic_swc}}}, {".nml", {{"Cell", load_neuroml_cell}, {"Morph", load_neuroml_morph}}}, {".asc", {{"Default", load_asc}}}}; diff --git a/src/utils.cpp b/src/utils.cpp index 8b6f3fc..87ebccb 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -21,7 +21,7 @@ std::filesystem::path get_resource_path(const std::filesystem::path& fn) { CFURLRef appUrlRef = CFBundleCopyBundleURL( CFBundleGetMainBundle() ); CFStringRef macPath = CFURLCopyFileSystemPath( appUrlRef, kCFURLPOSIXPathStyle ); CFStringEncoding encodingMethod = CFStringGetSystemEncoding(); - const char* path = CFStringGetCStringPtr(macPath, encodingMethod); + auto path = std::string(CFStringGetCStringPtr(macPath, encodingMethod)); CFRelease(appUrlRef); CFRelease(macPath); return std::filesystem::path{path} / "Contents/Resources" / fn;