Sha256: 6d349e3720bd07aa2b752ce06534940a634ee06032b8598f905315b6c253a75c

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

# frozen_string_literal: true

module ChemScanner
  module Interpreter
    # Molecule class
    class Fragment
      extend Forwardable

      def_delegators :@fragment, :id, :parser, :parser_type,
                     :polygon, :polygon=, :boxed, :boxed=,
                     :node_map, :node_map=, :bond_map, :bond_map=, :graphic_map

      def initialize(chemdraw_fragment)
        @fragment = chemdraw_fragment
      end

      def add(other)
        @fragment.boxed |= other.boxed

        @fragment.node_map.merge!(other.node_map)
        @fragment.bond_map.merge!(other.bond_map)

        @fragment.rebuild_polygon
      end

      def clone
        cfrag = @fragment.clone
        cfrag.set_new_id
        cloned = self.class.new(cfrag)
        cloned.boxed = @fragment.boxed
        cloned.node_map = @fragment.node_map
        cloned.bond_map = @fragment.bond_map

        cloned
      end

      def set_id(new_id)
        @fragment.id = new_id
      end

      def line?
        node_map = @fragment.node_map
        return false if node_map.count < 3

        points = []
        node_map.values.each_with_index do |node, i|
          points << node.point
          next if i < 2

          seg1 = Geometry::Segment.new(points[i - 3], points[i - 2])
          seg2 = Geometry::Segment.new(points[i - 2], points[i - 1])
          return false unless seg1.lies_on_one_line_with?(seg2)
        end

        true
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
chem_scanner-0.1.3 lib/chem_scanner/interpreter/element/fragment.rb