Compare commits

...

10 Commits

Author SHA1 Message Date
izzy lyseggen 4698799b43 ci: fix patch version script 2022-06-21 13:10:31 +01:00
izzy lyseggen 5d4e6ac89a ci: use semver tag for patching 2022-06-21 13:02:23 +01:00
izzy lyseggen b1c09c62d9 feat(converter): mesh enhancements (#50)
* feat(converter): smooth & preserve raw mesh

also only create components for `displayValue` geometry

wip - to try another edge strategy as this has caused quite a perf hit

* fix(converter): don't preserve edges for now

it is way too slow in the current implementation.
i think we can make it work in sketchup 2022 with the entities building,
but as of rn it seems like a no go for 2021
2022-06-21 12:58:59 +01:00
izzy lyseggen 2b7b74dbdd chore(ui): test removing core j (#48) 2022-06-20 16:28:07 +01:00
izzy lyseggen 42f3ae8490 ci: update tag parsing and ui build (#47)
* ci: update tag parsing and ui build

* chore(deps): stackoverflow and i are besties

testing out this workaround - will do a beta release

* ci: deploy filter tags

* ci: fix release label tag
2022-06-10 14:51:16 +01:00
izzy lyseggen 479cd9584a fix(ci): build on node 16 (#46)
* chore(ui): revert package lock

* chore(ui): upgrade object loader again (???)

* ci: omg i'm so dumb (node 16)
2022-06-10 09:40:30 +01:00
izzy lyseggen ec250fe6a5 fix(ui): revert package upgrades (regeneratorRuntime err) (#45)
* chore: del some old files

* chore(ui): revert to old packages

* chore(ui): updgrade speckle object loader
2022-06-10 07:24:52 +01:00
izzy lyseggen 7d73ebf7d0 feat(converter): edges and preserved faces on to_speckle (#44)
* chore: update packages

* chore: add debug 2022 vscode task

* feat(converter): ngons and edges on `to_speckle`

* feat(converter): big improvements 🥳

* feat(convert): add triangulation for faces with holes

you'll lose the true face with hole on receive, but this is the best
intermediary solution that won't break other connectors
2022-06-09 17:05:09 +01:00
izzy lyseggen a965065e62 style: formattinggggg (#39) 2022-03-29 15:49:22 +01:00
izzy lyseggen c9c9ecf5c6 chore(metrics): update oneclick reporting (#38) 2022-03-22 11:32:35 +00:00
29 changed files with 20762 additions and 5969 deletions
+14 -18
View File
@@ -9,18 +9,15 @@ orbs:
jobs:
build-ui:
docker:
- image: 'circleci/node:14'
- image: "circleci/node:16"
steps:
- checkout
- run:
command: 'rm package-lock.json'
working_directory: 'ui'
command: "npm install"
working_directory: "ui"
- run:
command: 'npm install'
working_directory: 'ui'
- run:
command: 'npm run build'
working_directory: 'ui'
command: "npm run build"
working_directory: "ui"
- persist_to_workspace:
root: ./
paths:
@@ -43,15 +40,14 @@ jobs:
shell: powershell.exe
command:
| # If no tag, use 0.0.0.1 and don't make any YML (for testing only!)
$tag = if([string]::IsNullOrEmpty($env:CIRCLE_TAG)) { "0.0.1" } else { $env:CIRCLE_TAG }
$semver = $tag.replace("-beta","")
$version = "$($semver).$($env:CIRCLE_BUILD_NUM)"
$channel = "latest"
if($tag -like "*-beta") { $channel = "beta" }
# only create the yml if we have a tag
New-Item -Force "speckle-sharp-ci-tools/Installers/sketchup/$channel.yml" -ItemType File -Value "version: $version"
$tag = if([string]::IsNullOrEmpty($env:CIRCLE_TAG)) { "0.0.0" } else { $env:CIRCLE_TAG }
$semver = if($tag.Contains('/')) {$tag.Split("/")[1] } else { $tag }
$ver = if($semver.Contains('-')) {$semver.Split("-")[0] } else { $semver }
$channel = if($semver.Contains('-')) {$semver.Split("-")[1] } else { "latest" }
$version = "$($ver).$($env:CIRCLE_BUILD_NUM)"
New-Item -Force "speckle-sharp-ci-tools/Installers/sketchup/$channel.yml" -ItemType File -Value "version: $semver"
echo $version
python patch_version.py $version
python patch_version.py $semver
speckle-sharp-ci-tools\InnoSetup\ISCC.exe speckle-sharp-ci-tools\sketchup.iss
- persist_to_workspace:
root: ./
@@ -62,7 +58,7 @@ jobs:
docker:
- image: cimg/base:2021.01
steps:
- run:
- run:
name: Clone
command: git clone https://$GITHUB_TOKEN@github.com/specklesystems/speckle-sharp-ci-tools.git speckle-sharp-ci-tools
- persist_to_workspace:
@@ -120,6 +116,6 @@ workflows:
- build-connector
filters:
tags:
only: /[0-9]+(\.[0-9]+)*/
only: /([0-9]+)\.([0-9]+)\.([0-9]+)(?:-\w+)?$/
branches:
ignore: /.*/ # For testing only! /ci\/.*/
+10 -1
View File
@@ -12,6 +12,15 @@
"command": "&'C:/Program Files/SketchUp/SketchUp 2021/SketchUp.exe' -rdebug 'ide port=7000'",
},
"problemMatcher": []
}
},
{
"label": "Debug SketchUp 2022",
"type": "shell",
"command": "open -a '/Applications/SketchUp 2022/SketchUp.app' --args -rdebug 'ide port=7000'",
"windows": {
"command": "&'C:/Program Files/SketchUp/SketchUp 2022/SketchUp.exe' -rdebug 'ide port=7000'",
},
"problemMatcher": []
},
]
}
-15
View File
@@ -1,15 +0,0 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
require "bundler/setup"
require "speckle_connector"
# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.
# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start
require "irb"
IRB.start(__FILE__)
-8
View File
@@ -1,8 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx
bundle install
# Do any other automated setup that you need to do here
-8
View File
@@ -1,8 +0,0 @@
# frozen_string_literal: true
require_relative "speckle_connector/version"
module SpeckleConnector
class Error < StandardError; end
# Your code goes here...
end
-5
View File
@@ -1,5 +0,0 @@
# frozen_string_literal: true
module SpeckleConnector
VERSION = "0.1.0"
end
+3 -2
View File
@@ -25,7 +25,8 @@ def patch_installer(tag):
with open(iss_file, "r") as file:
lines = file.readlines()
lines.insert(11, f'#define AppVersion "{tag}"\n')
lines.insert(11, f'#define AppVersion "{tag.split("-")[0]}"\n')
lines.insert(12, f'#define AppInfoVersion "{tag}"\n')
with open(iss_file, "w") as file:
file.writelines(lines)
@@ -39,7 +40,7 @@ def main():
return
tag = sys.argv[1]
if not re.match(r"[0-9]+(\.[0-9]+)*$", tag):
if not re.match(r"([0-9]+)\.([0-9]+)\.([0-9]+)", tag):
raise ValueError(f"Invalid tag provided: {tag}")
print(f"Patching version: {tag}")
@@ -9,11 +9,13 @@ module SpeckleSystems::SpeckleConnector
include ToNative
include ToSpeckle
attr_accessor :units, :component_defs
attr_accessor :units, :component_defs, :registry, :entity_observer
def initialize(units = "m")
@units = units
@component_defs = {}
# @registry = Sketchup.active_model.attribute_dictionary("speckle_id_registry", true)
# @entity_observer = SpeckleEntityObserver.new
end
def convert_to_speckle(obj)
+21
View File
@@ -0,0 +1,21 @@
module SpeckleSystems::SpeckleConnector
class SpeckleEntityObserver < Sketchup::EntityObserver
attr_accessor :registry
def initialize
super()
@registry = Sketchup.active_model.attribute_dictionary("speckle_id_registry", true)
end
def onEraseEntity(entity)
app_id = entity.get_attribute("speckle", "applicationId")
return if app_id.nil?
p(app_id)
@registry.delete_key(app_id)
p(@registry)
end
end
end
+102 -18
View File
@@ -8,9 +8,14 @@ module SpeckleSystems::SpeckleConnector::ToNative
elsif obj.is_a?(Hash) && obj.key?("speckle_type")
return if is_ignored_speckle_type(obj)
puts(">>> Found #{obj["speckle_type"]}: #{obj["id"]}")
props = obj.keys.filter_map { |key| key unless key.start_with?("_") }
props.each { |prop| traverse_commit_object(obj[prop]) }
if obj["displayValue"].nil?
puts(">>> Found #{obj["speckle_type"]}: #{obj["id"]}. Continuing traversal.")
props = obj.keys.filter_map { |key| key unless key.start_with?("_") }
props.each { |prop| traverse_commit_object(obj[prop]) }
else
puts(">>> Found #{obj["speckle_type"]}: #{obj["id"]} with displayValue.")
convert_to_native(obj)
end
elsif obj.is_a?(Hash)
obj.each_value { |value| traverse_commit_object(value) }
elsif obj.is_a?(Array)
@@ -38,21 +43,22 @@ module SpeckleSystems::SpeckleConnector::ToNative
["Objects.BuiltElements.Revit.Parameter"].include?(obj["speckle_type"])
end
def convert_to_native(obj, entities = SketchUp.active_model.entities)
puts(">>> Converting #{obj["speckle_type"]}: #{obj["id"]}")
def convert_to_native(obj, entities = Sketchup.active_model.entities)
return display_value_to_native_component(obj, entities) unless obj["displayValue"].nil?
case obj["speckle_type"]
when "Objects.Geometry.Line", "Objects.Geometry.Polyline" then edge_to_native(obj, entities)
when "Objects.Other.BlockInstance" then component_instance_to_native(obj, entities)
when "Objects.Other.BlockDefinition" then component_definition_to_native(obj)
when "Objects.Geometry.Mesh" then mesh_to_native(obj, entities)
when "Objects.Geometry.Brep" then mesh_to_native(obj["displayMesh"], entities)
when "Objects.Geometry.Brep" then mesh_to_native(obj["displayValue"], entities)
else
nil
end
# rescue StandardError => e
# puts("Failed to convert #{obj["speckle_type"]} (id: #{obj["id"]})")
# puts(e)
# nil
rescue StandardError => e
puts("Failed to convert #{obj["speckle_type"]} (id: #{obj["id"]})")
puts(e)
nil
end
def length_to_native(length, units = @units)
@@ -72,6 +78,15 @@ module SpeckleSystems::SpeckleConnector::ToNative
end
end
def edge_to_native_component(line, entities)
line_id = line["applicationId"].to_s.empty? ? line["id"] : line["applicationId"]
definition = component_definition_to_native([line], "def::#{line_id}")
find_and_erase_existing_instance(definition, line_id)
instance = entities.add_instance(definition, Geom::Transformation.new)
instance.name = line_id
instance
end
def face_to_native
nil
end
@@ -80,7 +95,16 @@ module SpeckleSystems::SpeckleConnector::ToNative
Geom::Point3d.new(length_to_native(x, units), length_to_native(y, units), length_to_native(z, units))
end
def point_to_native_array(x ,y ,z ,units)
[length_to_native(x, units), length_to_native(y, units), length_to_native(z, units)]
end
# converts a mesh to a native mesh and adds the faces to the given entities collection
def mesh_to_native(mesh, entities)
_speckle_mesh_to_native_mesh(mesh, entities)
end
def _speckle_mesh_to_native_mesh(mesh, entities)
native_mesh = Geom::PolygonMesh.new(mesh["vertices"].count / 3)
points = []
mesh["vertices"].each_slice(3) do |pt|
@@ -95,29 +119,86 @@ module SpeckleSystems::SpeckleConnector::ToNative
native_mesh.add_polygon(indices.map { |index| points[index] })
end
entities.add_faces_from_mesh(native_mesh, 4, material_to_native(mesh["renderMaterial"]))
native_mesh
end
def _hidden_edges_mesh_to_native_mesh(mesh, entities)
native_mesh = Geom::PolygonMesh.new(mesh["vertices"].count / 3)
points = []
mesh["vertices"].each_slice(3) do |pt|
points.push(point_to_native(pt[0], pt[1], pt[2], mesh["units"]))
end
edge_flags = mesh["faceEdgeFlags"]
faces = mesh["faces"]
loops = []
flags = []
while faces.count.positive?
num_pts = faces.shift
# 0 -> 3, 1 -> 4 to preserve backwards compatibility
num_pts += 3 if num_pts < 3
indices = faces.shift(num_pts)
current_edge_flags = edge_flags.shift(num_pts)
outer_loop = indices.map { |index| points[index] }
if current_edge_flags.include?(true)
loops << outer_loop
flags << current_edge_flags
else
native_mesh.add_polygon(outer_loop)
end
end
entities.add_faces_from_mesh(native_mesh, 0, material_to_native(mesh["renderMaterial"]))
loops.each do |l|
loop_flags = flags.shift
face = entities.add_face(l)
face.edges.each_with_index { |edge, index| edge.soft = edge.smooth = loop_flags[index] }
end
native_mesh
end
def component_definition_to_native(block_def)
definition = Sketchup.active_model.definitions[block_def["name"]]
return definition if definition && (definition.name == block_def["name"] || definition.guid == block_def["applicationId"])
# creates a component definition and instance from a speckle object with a display value
def display_value_to_native_component(obj, entities)
obj_id = obj["applicationId"].to_s.empty? ? obj["id"] : obj["applicationId"]
definition = component_definition_to_native(obj["displayValue"], "def::#{obj_id}")
find_and_erase_existing_instance(definition, obj_id)
transform = obj["transform"].nil? ? Geom::Transformation.new : transform_to_native(obj["transform"])
instance = entities.add_instance(definition, transform)
instance.name = obj_id
instance
end
# finds or creates a component definition from the geometry and the given name
def component_definition_to_native(geometry, name, application_id = "")
definition = Sketchup.active_model.definitions[name]
return definition if definition && (definition.name == name || definition.guid == application_id)
definition&.entities&.clear!
definition ||= Sketchup.active_model.definitions.add(block_def["name"])
block_def["geometry"].each { |obj| convert_to_native(obj, definition.entities) }
puts("definition finished: #{block_def["name"]} (#{block_def["id"]})")
puts(" entity count: #{definition.entities.count}")
definition ||= Sketchup.active_model.definitions.add(name)
geometry.each { |obj| convert_to_native(obj, definition.entities) }
puts("definition finished: #{name} (#{application_id})")
# puts(" entity count: #{definition.entities.count}")
definition
end
# takes a component definition and finds and erases the first instance with the matching name (and optionally the applicationId)
def find_and_erase_existing_instance(definition, name, app_id = "")
definition.instances.find { |ins| ins.name == name || ins.guid == app_id }&.erase!
end
# creates a component instance from a block
def component_instance_to_native(block, entities)
# is_group = block.key?("is_sketchup_group") && block["is_sketchup_group"]
# something about this conversion is freaking out if nested block geo is a group
# so this is set to false always until I can figure this out
is_group = false
definition = component_definition_to_native(block["blockDefinition"])
definition = component_definition_to_native(
block["blockDefinition"]["geometry"],
block["blockDefinition"]["name"],
block["blockDefinition"]["applicationId"]
)
name = block["name"].nil? || block["name"].empty? ? block["id"] : block["name"]
transform = transform_to_native(
block["transform"].is_a?(Hash) ? block["transform"]["value"] : block["transform"],
block["units"]
@@ -128,9 +209,12 @@ module SpeckleSystems::SpeckleConnector::ToNative
else
entities.add_instance(definition, transform)
end
# erase existing instances after creation and before rename because you can't have definitions without instances
find_and_erase_existing_instance(definition, name, block["applicationId"])
puts("Failed to create instance for speckle block instance #{block["id"]}") if instance.nil?
instance.transformation = transform if is_group
instance.material = material_to_native(block["renderMaterial"])
instance.name = name
instance
end
+80 -24
View File
@@ -6,6 +6,7 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
length.__send__("to_#{SpeckleSystems::SpeckleConnector::SKETCHUP_UNIT_STRINGS[@units]}")
end
# convert an edge to a speckle line
def edge_to_speckle(edge)
{
speckle_type: "Objects.Geometry.Line",
@@ -18,6 +19,7 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
}
end
# covnert a component definition to a speckle block definition
def component_definition_to_speckle(definition)
guid = definition.guid
return @component_defs[guid] if @component_defs.key?(guid)
@@ -38,6 +40,7 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
@component_defs[guid] = speckle_def
end
# convert a component instane to a speckle block instance
def component_instance_to_speckle(instance, is_group: false)
transform = instance.transformation
{
@@ -46,7 +49,7 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
is_sketchup_group: is_group,
units: @units,
bbox: bounds_to_speckle(instance.bounds),
name: instance.name,
name: instance.name == "" ? nil : instance.name,
renderMaterial: instance.material.nil? ? nil : material_to_speckle(instance.material),
transform: transform_to_speckle(transform),
"@blockDefinition" => component_definition_to_speckle(instance.definition)
@@ -56,28 +59,33 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
def group_mesh_to_speckle(component_def)
mat_groups = {}
nested_blocks = []
lines = []
component_def.entities.each do |entity|
nested_blocks.push(component_instance_to_speckle(entity)) if entity.typename == "ComponentInstance"
next unless entity.typename == "Face"
next unless %w[Face].include?(entity.typename)
face = entity
# convert material
mat_id = face.material.nil? ? "none" : face.material.entityID
mat_groups[mat_id] = initialise_group_mesh(face, component_def.bounds) unless mat_groups.key?(mat_id)
# add points and texture coordinates
mesh = face.mesh(1)
mat_groups[mat_id]["@(31250)vertices"].push(*points_to_array(mesh))
mat_groups[mat_id]["@(31250)textureCoordinates"].push(*uvs_to_array(mesh))
if face.loops.size > 1
mesh = face.mesh
mat_groups[mat_id]["@(31250)vertices"].push(*mesh_points_to_array(mesh))
mat_groups[mat_id]["@(62500)faces"].push(*mesh_faces_to_array(mesh, mat_groups[mat_id][:pt_count] - 1))
mat_groups[mat_id]["@(31250)faceEdgeFlags"].push(*mesh_edge_flags_to_array(mesh))
else
mat_groups[mat_id]["@(31250)vertices"].push(*face_vertices_to_array(face))
mat_groups[mat_id]["@(62500)faces"].push(*face_indices_to_array(face, mat_groups[mat_id][:pt_count]))
mat_groups[mat_id]["@(31250)faceEdgeFlags"].push(*face_edge_flags_to_array(face))
end
mat_groups[mat_id][:pt_count] += face.vertices.count
# add faces
mat_groups[mat_id]["@(62500)faces"].push(*faces_to_array(mesh, mat_groups[mat_id][:pt_count]))
mat_groups[mat_id][:pt_count] += mesh.points.count
end
mat_groups.values.map { |group| group.delete(:pt_count) }
mat_groups.values + nested_blocks
mat_groups.values + lines + nested_blocks
end
def transform_to_speckle(transform)
@@ -113,29 +121,37 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
bbox: bounds_to_speckle(bounds),
"@(31250)vertices" => [],
"@(62500)faces" => [],
"@(31250)faceEdgeFlags" => [],
"@(31250)textureCoordinates" => [],
pt_count: -1,
pt_count: 0,
renderMaterial: face.material.nil? ? nil : material_to_speckle(face.material)
}
end
def faces_to_array(mesh, offset)
# get an array of face indices from a sketchup polygon mesh
def mesh_faces_to_array(mesh, offset = 0)
faces = []
mesh.polygons.each do |poly|
faces.push(
case poly.count
when 3 then 0 # tris
when 4 then 1 # polys
else
poly.count # ngons
end,
*poly.map { |coord| coord.abs + offset }
poly.count, *poly.map { |index| index.abs + offset }
)
end
faces
end
def points_to_array(mesh)
# get an array of face indices from a sketchup polygon mesh INCLUDING negative indices for hidden meshes
def mesh_faces_with_edges_to_array(mesh, offset)
faces = []
mesh.polygons.each do |poly|
faces.push(
poly.count, *poly.map { |index| index.positive? ? index + offset : index - offset }
)
end
faces
end
# get a flat array of vertices from a sketchup polygon mesh
def mesh_points_to_array(mesh)
pts_array = []
mesh.points.each do |pt|
pts_array.push(
@@ -147,6 +163,46 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
pts_array
end
def mesh_edge_flags_to_array(mesh)
edge_flags = []
mesh.polygons.each do |poly|
edge_flags.push(
*poly.map(&:negative?)
)
end
edge_flags
end
# get a flat array of face indices from a sketchup face
def face_indices_to_array(face, offset)
face_array = [face.vertices.count]
face_array.push(*face.vertices.count.times.map { |index| index + offset })
face_array
end
# get a flat array of face indices from a sketchup face
def face_indices_with_edges_to_array(face, offset = 1)
soft_edges = face.outer_loop.edges.map(&:soft?)
face_array = [face.vertices.count]
face_array.push(*face.vertices.count.times.map { |index| soft_edges[index] ? -(index + offset) : index + offset })
face_array
end
def face_edge_flags_to_array(face)
face.outer_loop.edges.map(&:soft?)
end
# get a flat array of vertices from a list of sketchup vertices
def face_vertices_to_array(face)
pts_array = []
face.vertices.each do |v|
pt = v.position
pts_array.push(length_to_speckle(pt[0]), length_to_speckle(pt[1]), length_to_speckle(pt[2]))
end
pts_array
end
def uvs_to_array(mesh)
uvs_array = []
mesh.uvs(true).each do |pt|
@@ -159,15 +215,15 @@ module SpeckleSystems::SpeckleConnector::ToSpeckle
end
def face_to_speckle(face)
mesh = face.mesh(1)
mesh = face.loops.count > 1 ? face.mesh : nil
{
speckle_type: "Objects.Geometry.Mesh",
units: @units,
renderMaterial: face.material.nil? ? nil : material_to_speckle(face.material),
bbox: bounds_to_speckle(face.bounds),
"@(31250)vertices" => points_to_array(mesh),
"@(62500)faces" => faces_to_array(mesh, -1),
"@(31250)textureCoordinates" => uvs_to_array(mesh)
"@(31250)vertices" => mesh.nil? ? face_vertices_to_array(face) : mesh_points_to_array(mesh),
"@(62500)faces" => mesh.nil? ? face_indices_to_array(face, 0) : mesh_faces_to_array(mesh, -1),
"@(31250)faceEdgeFlags" => mesh.nil? ? face_edge_flags_to_array(face) : mesh_edge_flags_to_array(mesh),
}
end
+19
View File
@@ -0,0 +1,19 @@
/* eslint-env node */
/** @type {import("eslint").Linter.Config} */
const config = {
env: {
browser: true,
es2021: true,
commonjs: false
},
ignorePatterns: ['nginx'],
extends: ['plugin:vue/recommended', 'eslint:recommended', 'prettier', 'prettier/vue'],
parserOptions: {
sourceType: 'module'
},
plugins: ['vue'],
rules: { 'no-console': 1 }
}
module.exports = config
-47
View File
@@ -1,47 +0,0 @@
{
"env": {
"browser": true,
"es2021": true
},
"ignorePatterns": ["main-frontend.js"],
"extends": [
"plugin:vue/recommended",
"prettier",
"prettier/vue",
"plugin:prettier/recommended",
"eslint:recommended"
],
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": ["vue", "prettier"],
"rules": {
"arrow-spacing": [
2,
{
"before": true,
"after": true
}
],
//"array-bracket-spacing": [2, "always"],
"block-spacing": [2, "always"],
"camelcase": [
1,
{
"properties": "always"
}
],
// "space-in-parens": [2, "always"],
"keyword-spacing": 2,
"semi": "off",
"indent": ["error", 2, { "SwitchCase": 1 }],
"space-unary-ops": [
2,
{
"words": true,
"nonwords": false
}
]
}
}
+5
View File
@@ -1,24 +1,29 @@
# ui
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
+1 -3
View File
@@ -1,5 +1,3 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
presets: ['@vue/cli-plugin-babel/preset']
}
+8915 -5778
View File
File diff suppressed because it is too large Load Diff
+6 -4
View File
@@ -3,17 +3,19 @@
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve --port 8081",
"dev": "vue-cli-service serve --port 8081",
"build": "vue-cli-service build",
"watch-build": "vue-cli-service build --watch --mode production",
"lint": "vue-cli-service lint"
"lint": "eslint . --ext .js,.ts,.vue",
"prettier:check": "prettier --check .",
"prettier:fix": "prettier --write ."
},
"dependencies": {
"@speckle/objectloader": "^2.3.0",
"@speckle/objectloader": "^2.6.0",
"aws-sdk": "^2.981.0",
"core-js": "^3.6.5",
"debounce": "^1.2.1",
"mixpanel-browser": "^2.45.0",
"regenerator-runtime": "^0.13.9",
"register-service-worker": "^1.7.1",
"sqlite3": "^5.0.2",
"v-tooltip": "^2.1.3",
+30 -23
View File
@@ -1,26 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<title><%= htmlWebpackPlugin.options.title %></title>
<link
href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"
/>
</head>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
<body>
<noscript>
<strong>
We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without
JavaScript enabled. Please enable it to continue.
</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
+2 -2
View File
@@ -19,7 +19,7 @@
dense
flat
solo
></v-text-field>
/>
<v-spacer />
<v-btn icon small class="mx-1" @click="switchTheme">
<v-icon>mdi-theme-light-dark</v-icon>
@@ -59,7 +59,7 @@
</div>
</v-card-text>
<v-card-text v-if="accounts">
<v-divider class="my-3"></v-divider>
<v-divider class="my-3" />
<div v-for="account in accounts" :key="account.id">
<v-btn
+7 -5
View File
@@ -124,7 +124,7 @@
dense
flat
placeholder="Write your commit message here"
></v-text-field>
/>
</div>
</v-slide-y-transition>
</div>
@@ -135,7 +135,9 @@
height="14"
indeterminate
>
<div class="text-caption">{{ loadingStage }}</div>
<div class="text-caption">
{{ loadingStage }}
</div>
</v-progress-linear>
</v-card>
<v-card v-else class="my-2">
@@ -286,7 +288,7 @@ export default {
this.loadingStage = null
})
bus.$on(`one-click-send-${this.streamId}`, () => {
this.$mixpanel.track('Send', { oneClick: true })
this.$mixpanel.track('Send', { method: 'OneClick' })
})
if (this.saved) sketchup.notify_connected(this.streamId)
@@ -363,7 +365,7 @@ export default {
async send() {
this.loadingStage = 'converting'
this.loadingSend = true
this.$mixpanel.track('Send', { oneClick: false })
this.$mixpanel.track('Send')
sketchup.send_selection(this.streamId)
console.log('>>> SpeckleSketchUp: Objects requested from SketchUp')
await this.sleep(2000)
@@ -404,7 +406,7 @@ export default {
sourceApplication: 'sketchup',
totalChildrenCount: s.objects[hash].totalChildrenCount
}
var res = await this.$apollo.mutate({
let res = await this.$apollo.mutate({
mutation: gql`
mutation CommitCreate($commit: CommitCreateInput!) {
commitCreate(commit: $commit)
+1 -1
View File
@@ -14,7 +14,7 @@
<v-img v-else :src="`https://robohash.org/` + id + `.png?size=40x40`" />
</v-avatar>
<v-avatar v-else class="ma-1" :size="size" v-bind="attrs" v-on="on">
<v-img contain src="/logo.svg"></v-img>
<v-img contain src="/logo.svg" />
</v-avatar>
</template>
<v-card v-if="userById" style="width: 200px" :to="isSelf ? '/profile' : '/profile/' + id">
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -43,7 +43,7 @@ query Stream($id: String!) {
authorName
authorAvatar
referencedObject
}
}
}
}
}
+1 -1
View File
@@ -46,7 +46,7 @@ query Streams($cursor: String) {
authorName
authorAvatar
referencedObject
}
}
}
}
}
+2
View File
@@ -1,3 +1,5 @@
import 'regenerator-runtime/runtime'
import Vue from 'vue'
import App from './App.vue'
import router from './router'
+1 -1
View File
@@ -1,4 +1,4 @@
var mixpanel = require('mixpanel-browser')
let mixpanel = require('mixpanel-browser')
import crypto from 'crypto'
const SpeckleMetrics = {
+1 -1
View File
@@ -118,4 +118,4 @@
visibility: visible;
opacity: 1;
transition: opacity 0.15s;
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
<v-col v-if="$apollo.loading && !streams">
<v-row>
<v-col>
<v-skeleton-loader type="card-heading, list-item-three-line"></v-skeleton-loader>
<v-skeleton-loader type="card-heading, list-item-three-line" />
</v-col>
</v-row>
</v-col>
+1 -1
View File
@@ -1,7 +1,7 @@
const path = require('path')
module.exports = {
publicPath: "./",
publicPath: './',
outputDir: path.resolve(__dirname, '../speckle_connector', 'html'),
transpileDependencies: ['vuetify', '@speckle/objectloader']
}